多线程(下)——多人网络通信程序
1.client包
ChatRoomClient类
package ChatRoom.client;
import ChatRoom.common.ChatMessage;
import ChatRoom.common.DataExchange;
import ChatRoom.common.Utils;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import static ChatRoom.common.Constants.*;
public class ChatRoomClient {
private String server;
DataExchange exchange;
private String userName;
private String currentToName;
private Scanner input = new Scanner(System.in);
public ChatRoomClient(String server) throws IOException {
System.out.println("客户端连接中······");
this.server = server;
Socket socket = new Socket(server, SERVER_PORT);
System.out.println("客户端已连接到服务器:" + socket.getRemoteSocketAddress());
exchange = new DataExchange(socket);
this.server = server;
}
public void start() throws IOException {
initName();
Thread readThread = new Thread(() -> {
while (true) {
try {
ChatMessage chatMessage = exchange.receive();
if (chatMessage.getFrom().equalsIgnoreCase(ADMIN_NAME) &&
chatMessage.getMessage().trim().equalsIgnoreCase(BYE)) {
exchange.close();
System.out.println("已经离开可聊天室,聊天结束");
System.exit(0);
}
System.out.println("from\"" + chatMessage.getFrom() + "\":" + chatMessage.getMessage());
} catch (IOException e) {
e.printStackTrace();
exchange.close();
System.exit(-2);
}
}
});
readThread.start();
Thread writeThread = new Thread(() -> {
while (true) {
try {
exchange.send(creatChatMessage());
} catch (Exception e) {
e.printStackTrace();
exchange.close();
System.exit(-3);
}
}
});
writeThread.start();
}
private ChatMessage creatChatMessage() {
while (true) {
String line = input.nextLine().trim();
String to = null;
String message = null;
try {
if (line.startsWith(CHAT_WITH_START)) {
to = line.substring(1, line.indexOf(SPACE_STRING)).trim();
String error = Utils.isValidToUserName(to);
if (error == null) {
currentToName = to;
message = line.substring(line.indexOf(SPACE_STRING) + 1);
} else {
System.out.println("用户名\"" + to + "\"不合法:" + error);
continue;
}
} else {
if (currentToName == null) {
System.out.println