Java之多人聊天室
基于TCP协议书写的服务端,服务端开启之后,只能给一个客户端提供服务,在服务结束之后,服务端就关闭了,其他的客户端就无法在连接到当前这个服务端。
解决一个服务端,可以同时(并发)给多个客户端提供服务:
我们需要在服务端开启多线程,只要有一个客户端连接到服务端,那么这是服务端内部就应该开启一个线程,为这个客户端服务,然后服务端继续等待下一个客户端的连接,只要有客户端连接到服务端,服务端就需要开启线程为当前连接到的这个客户端进行服务。
开启线程:直接new Thread 调用start,获取使用线程池都可以完成。
线程的任务:在服务端获取到客户端对象之后,后续的所有操作,都是基于当前这个客户端而进行,那么当前这些操作都属于线程的任务。
服务端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; //聊天室服务器端 public class Server { //存放所有链接上当前服务器的客户端 private List<Socket> clientSockets=new ArrayList<Socket>(); public Server() { try { //1.创建服务器端socket ServerSocket serverSocket=new ServerSocket(9999); while(true) { //2.接收客户端的socket Socket socket= serverSocket.accept(); //3.存入集合中 this.clientSockets.add(socket); //4.开一个线程处理客户端发送过来的消息 ReceiveThread thread=new ReceiveThread(socket); thread.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //创建一个线程 接收客户端的socket class ReceiveThread extends Thread { private Socket currentSocket; public ReceiveThread(Socket socket) { this.currentSocket=socket; } public void run() { try { //获得当前客户端中拿到的消息 InputStream is= this.currentSocket.getInputStream(); //获得输入流 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is)); String msg=null; while((msg=bufferedReader.readLine())!=null) { //群发给所有的客户端 for(Socket socket :clientSockets) { PrintWriter pw =new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); pw.println(msg); pw.flush(); //发送到客户端 //不要关闭输出流 ftp协议中 规定 如果关闭当前socket输出流 则意味着对应的socket关闭 } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
客户端