Socket和多线程实现简易聊天室功能

1.首先建立服务端:ServiceSocket.java

**
 * @ClassName: ServiceSocket
 * @Description: 建立服务端
 * @Author: 
 * @Date: 2019/6/10
 */
public class ServiceSocket {
    public static List<Socket> socketList = new ArrayList<Socket>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6666);//新建一个服务器套接字,并绑定指定端口
        System.out.println("聊天室开启");
        while(true){
            Socket accept = serverSocket.accept();//监听绑定的端口
            System.out.println("上线通知:用户"+accept.getInetAddress()+ "端口:"+accept.getPort()+"上线了");
            socketList.add(accept);
            //新建线程
            new Thread(new ServiceSocketThread(accept)).start();

        }

    }
}

2.建立服务器端线程,用于监听绑定的端口:ServiceSocketThread.java

/**
 * @ClassName: ServiceSocketThread
 * @Description:
 * @Author: 
 * @Date: 2019/6/10
 */
public class ServiceSocketThread implements Runnable {

    public Socket socket;

    public ServiceSocketThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true){
                String str = br.readLine();//读取客户端输入的内容
                List<Socket> socketList = ServiceSocket.socketList;
                //循环遍历多个客户端,并将消息分别写入到控制台
                for (Socket socket1 : socketList) {
                    PrintWriter pw = new PrintWriter(socket1.getOutputStream());
                    pw.println(socket1.getInetAddress()+"说:"+str);
                    pw.flush();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

3.分别建立两个客户端

SocketClient1.java
/**
 * @ClassName: SocketClient1
 * @Description: 客户端1 启动两个线程,分别用于监听服务端和客户端
 * @Author: 
 * @Date: 2019/6/10
 */
public class SocketClient1 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("192.168.43.113",6666);
        System.out.println(socket.getInetAddress()+"连接成功!");
        new Thread(new SocketClientThread1(socket)).start();
        new Thread(new SocketClientThreah2(socket)).start();

    }
}
SocketClient2.java
/**
 * @ClassName: SocketClient1
 * @Description: 客户端2 启动两个线程,分别用于监听服务端和客户端
 * @Author: 
 * @Date: 2019/6/10
 */
public class SocketClient2 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost",6666);
        System.out.println(socket.getInetAddress()+"连接成功!");
        new Thread(new SocketClientThread1(socket)).start();
        new Thread(new SocketClientThreah2(socket)).start();

    }
}

4.建立用于监听客户端的线程:SocketClientThread1.java

/**
 * @ClassName: SocketClientThread1
 * @Description: 监听客户端线程
 * @Author: 
 * @Date: 2019/6/10
 */
public class SocketClientThread1 implements Runnable {
    public Socket socket;

    public SocketClientThread1(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取控制台输入的内容
            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            while (true){
                String readLine = br.readLine();
                pw.println(readLine);//将控制台输入的内容写入到服务端
                pw.flush();//刷新缓存
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 5.建立服务器端线程,此线程监听的是传递到服务端的内容:SocketClientThreah2.java

/**
 * @ClassName: SocketClientThreah2
 * @Description: 监听服务器线程
 * @Author: 
 * @Date: 2019/6/10
 */
public class SocketClientThreah2 implements Runnable {
    public Socket socket;

    public SocketClientThreah2(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (true){
                String s = br.readLine();//读取服务器端内容
                System.out.println(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6.分别启动服务端(ServiceSocket)和两个客户端(SocketClient1和SocketClient2)

首先启动服务端(ServiceSocket.java)启动后控制台输出以下内容:

聊天室开启

然后启动客户端1(SocketClient1.java),此时服务端和客户端1的控制台分别输出以下内容:

服务端:

上线通知:用户/127.0.0.1 端口:57257上线了

客户端1:

localhost/127.0.0.1连接成功!

最后启动客户端2(SocketClient2.java),此时服务端和客户端1的控制台分别输出以下内容:

服务端:

聊天室开启
上线通知:用户/127.0.0.1 端口:57257上线了
上线通知:用户/127.0.0.1 端口:57286上线了

客户端2 :

localhost/127.0.0.1连接成功!

分别在客户端1和客户端2输入内容:

localhost/127.0.0.1连接成功!
客户端1
/127.0.0.1说:客户端1
/127.0.0.1说:客户顿2
localhost/127.0.0.1连接成功!
/127.0.0.1说:客户端1
客户顿2
/127.0.0.1说:客户顿2

猜你喜欢

转载自blog.csdn.net/LSW_JAVADP/article/details/91376660