java socket实现多客户端群聊
程序员文章站
2024-03-22 15:04:34
...
package org.so;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
class Chat extends Thread {
private Socket socket;
private List<Socket> socketList;
private int count;
public Chat(int count, Socket socket, List<Socket> socketList) {
this.count = count;
this.socket = socket;
this.socketList = socketList;
}
public void run() {
BufferedReader reader = null;
PrintWriter writer = null;
try {
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String message = null;
while (true) {
message = reader.readLine();
// 接收到客户端的bye信息,客户端即将退出,并将bye写入到该客户端
if (message.equals("bye")) {
writer = new PrintWriter(socket.getOutputStream());
writer.println("bye");
writer.flush();
continue;
}
// 向所有的客户端发送接收到信息,实现群聊
for (int i = 0; i < socketList.size(); i++) {
writer = new PrintWriter(socketList.get(i)
.getOutputStream());
writer.println(count + " say: " + message);
writer.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChatServer {
/**
* Description
*
* @param args
*/
public void startWork() throws IOException {
ServerSocket serverSocket = new ServerSocket(2345);
List<Socket> socketList = new ArrayList<Socket>();
Socket socket = null;
int count = 0;
while (true) {
socket = serverSocket.accept();
count++;
System.out.println(count + " clinet connected to the server!");
// 将每一个连接到该服务器的客户端,加到List中
socketList.add(socket);
// 每一个连接到服务器的客户端,服务器开启一个新的线程来处理
new Chat(count, socket, socketList).start();
}
}
/**
* Description
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ChatServer chatServer = new ChatServer();
chatServer.startWork();
}
}
/**
* 接受服务器信息
*/
class ReadMes extends Thread {
private Socket socket;
public ReadMes(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String message = null;
while (true) {
message = reader.readLine();
// 当读服务器信息线程接收到bye,该线程退出
if (message.equals("bye")) {
break;
}
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
*
* 发送信息
*/
class SendMes extends Thread {
private Socket socket;
public SendMes(Socket socket) {
this.socket = socket;
}
public void run() {
BufferedReader input = null;
PrintWriter writer = null;
try {
input = new BufferedReader(new InputStreamReader(System.in));
writer = new PrintWriter(socket.getOutputStream());
String message = null;
while (true) {
message = input.readLine();
// 当输入bye客户端退出
if (message.equals("bye")) {
break;
}
// 向服务器端发送信息
writer.println(message);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (writer != null) {
writer.close();
}
}
}
}
class ChatClient {
private String ipAdress;
public ChatClient(String ipAString) {
this.ipAdress = ipAdress;
}
public void startWork() throws UnknownHostException, IOException {
Socket socket = new Socket(ipAdress, 2345);
new ReadMes(socket).start();
new SendMes(socket).start();
}
/**
* Description
*
* @param args
* @throws UnknownHostException
* @throws IOException
*/
public static void main(String[] args) throws UnknownHostException,
IOException {
ChatClient chatClient = new ChatClient(args[0]);
chatClient.startWork();
}
}