下面我们逐步讲解如何利用Java Socket和多线程实现多人聊天室功能:
1.建立Socket连接
首先,需要建立服务端和客户端的Socket连接。服务端需要绑定一个端口,等待客户端连接,而客户端则需要提供服务端的IP地址和端口号来连接服务端。
服务端代码示例:
public static void main(String[] args){
try {
ServerSocket serverSocket = new ServerSocket(port); //绑定端口
while (true) {
Socket socket = serverSocket.accept(); //等待客户端连接
//新建一个线程处理客户端请求
Thread thread = new Thread(new ServerThread(socket));
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
客户端代码示例:
public static void main(String[] args){
try {
Socket socket = new Socket(host, port); //连接服务端
//新建一个线程接收服务器消息
Thread thread = new Thread(new ClientThread(socket));
thread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
2.多线程处理客户端请求
当客户端与服务端建立连接后,服务端需要针对每一个连接新建一个线程来处理客户端的请求,这样可以实现多个客户端同时聊天的功能。客户端也需要开启一个线程来接收服务端发送来的消息。
服务端代码示例:
public class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
//处理客户端请求 如广播消息等
}
//客户端断开连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码示例:
public class ClientThread implements Runnable {
private Socket socket;
public ClientThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
//接收服务端消息
}
//服务端断开连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.实现聊天室功能
在服务端维护一个客户端列表,当客户端连接时,将其加入列表中。当有客户端发送消息时,服务端遍历列表,向所有客户端发送消息,实现聊天室的功能。
服务端代码示例:
public static List<Socket> socketList = new ArrayList<>();
public void addSocket(Socket socket){
socketList.add(socket);
}
public void removeSocket(Socket socket){
socketList.remove(socket);
}
public void sendMessage(String message){
for(Socket socket:socketList){
try {
PrintWriter writer = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(), "UTF-8"), true);
writer.println(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在ServerThread
中,需要将新的连接加入客户端列表中,处理客户端请求时,广播客户端发送的消息。
public void run() {
try {
//将新连接加入客户端列表
server.addSocket(socket);
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
//处理广播消息,向所有客户端发送
server.sendMessage(line);
}
//从客户端列表中移除断开的连接
server.removeSocket(socket);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
客户端在开启线程接收服务端消息后,可以通过写入控制台的方式发送消息给服务端。
public void run() {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("收到消息:" + line);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
至此,我们就完成了使用Java Socket和多线程实现的多人聊天室功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Socket+多线程实现多人聊天室功能 - Python技术站