基于TCP协议的网络聊天室

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43271086/article/details/97536859

1.客户端

package 网络编程;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client1 {
    public static void main  (String[] args) throws Exception {
        Socket s= new Socket("192.168.0.113", 2345);
        new Thread(new ClientReciverTherad(s)).start();
        PrintStream ps = new PrintStream(s.getOutputStream());
        String line  =  null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while ((line = br.readLine())!=null){
            ps.println(line);
        }
        //s.shutdownOutput();//关闭输入流
    }
}
package 网络编程;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ClientReciverTherad implements Runnable {
    private Socket s;
    BufferedReader br = null;
    //多条接受
    public ClientReciverTherad(Socket s) throws IOException {
        this.s = s;
        br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    }

    public void run(){
        try {
            String s = null;
            while (true) {
                while ((s = br.readLine()) != null) {
                    System.out.println(s);
                }
            }
            }catch(Exception e){
                e.printStackTrace();
            }

    }
}

2.服务器端

package com.imooc.inetadderss;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 基于TCP协议的Socket通信,实现用户登录
 * 服务器端
 * @author Marie
 *
 */
public class Server {
    public static List<Socket> socketList = new ArrayList<Socket>();

    public static void main(String[] args) {

        try {

            //1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket = new ServerSocket(2345);//指定1023往后的端口
            Socket socket = null;
            int count = 0;
            System.out.println("***服务器即将启动,等待客户端的链接***");
            //循环监听,等待客户端的连接
            while(true) {
                socket = serverSocket.accept();//调用此方法后,服务器处于阻塞的状态,等待客户端的侦听
                socketList.add(socket);
                count++;
                System.out.println("客户端的数量:"+count);
                InetAddress address = socket.getInetAddress();
                System.out.println("客户端IP地址:"+address.getHostAddress());

                ServerThread serverThread = new ServerThread(socket);
                serverThread.start();



            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
package com.imooc.inetadderss;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;


public class ServerThread extends Thread {
    Socket socket = null;
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    //线程执行的操作,响应客户端的请求
    public void run() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        OutputStream os = null;
        PrintWriter pw = null;
        try {
            //实现客户端和服务器端的交互,获取输入流,并读取客户端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is,"UTF-8");//将字节流转化为字符流
            br =new BufferedReader(isr);//添加缓冲区


            while(true) {

                String info = null;
                while((info = br.readLine())!=null) {//循环读取客户端信息

                    for(Socket s:Server.socketList) {
                        System.out.println("---------------");
                        os = s.getOutputStream();
                        pw = new PrintWriter(os);
                        System.out.println(info);
                        pw.println(info);
                        System.out.println("已转发!");
                        pw.flush();
                    }
                }
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                //关闭资源
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(is!=null)
                    is.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(socket!=null)
                    socket.close();
            }catch(IOException e){
                e.printStackTrace();
            }

        }

    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43271086/article/details/97536859