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();
}
}
}
}
客户端

浙公网安备 33010602011771号