简易局域网聊天系统–局域网QQ
服务器端
实现简易的启动停止服务器端操作,能记录基本日志:客户连接、消息传送,能查看连接客户的昵称。
启动服务器后开始监听客户端连接,创建一个新线程实现该监听操作。
// 启动新线程监听客户端
new Thread(new Runnable() {public void run() {writeLog("开始监听客户端:");listen();}
}).start();
为每一个客户端连接开启一个新线程处理通讯,包括处理输入流与输出流。
// 每监听到一个客户端连接,启动一个新线程处理该连接
new Participant(this, socket, usersList).start();
获取用户不同的行为实现不同的操作
String flag = in.readUTF(); // 获取用户操作行为
if ("validateUser".equals(flag)) { // 验证用户是否存在// ……………………
} else if ("newUser".equals(flag)) { // 新用户登录// ……………………
} else if ("message".equals(flag)) { // 用户间发送消息// ……………………
} else if ("userList".equals(flag)) { // 获取用户列表// ……………………
}
在服务器端,采用Map保存每个客户端对应的套接字:
private Map<String, Socket> usersList = new HashMap<String, Socket>();
key为客户端连接时输入的用户昵称,value为对应的套接字对象。
各客户端用户间发送消息时,通过服务器转发送该信息:
String sender = in.readUTF(); // 发送者
String receiver = in.readUTF(); // 接收者
String message = in.readUTF(); // 消息
// 添加日志
server.writeLog(sender + " 向 " + receiver + "发送消息:" + message);
// 服务器向目标转发消息,先获得要转发后的目标套接字对象
Socket socket = server.getUsersList().get(receiver);
System.out.println(out);
if (socket == null) { // 服务器已删除该客户端连接信息out.writeUTF("message");out.writeUTF("系统服务器");out.writeUTF(receiver + "已退出系统,无法再发送消息");out.flush();
} else {DataOutputStream thatOut = new DataOutputStream(socket.getOutputStream()); // 创建输出流对象if (thatOut != null) {thatOut.writeUTF("message");thatOut.writeUTF(sender);thatOut.writeUTF(message);thatOut.flush(); // 写入客户端输出流中}
}
客户端
先通过登录窗体实现服务器端连接,然后输入登录用户昵称,如果服务器端还未保存该昵称,则登录成功。登录成功后,可以直接先读取到服务器端已有登录用户的昵称,显示到列表中。双击好友列表中的任一项打开聊天对话框,然后双方可以开始聊天。
创建到服务器的套接字对象:
// 创建套接字对象
socket = new Socket(serverIp.getText().trim(), Integer.parseInt(port.getText().trim()));
连接的服务器与端口从窗体文本框中获取到。
登录成功后,将昵称发送到服务器保存:
out.writeUTF("newUser");
out.writeUTF(nickname);
out.flush();
刷新好友列表:
// 读取流中信息
String flag = in.readUTF();
if ("userList".equals(flag)) { // 好友列表String[] userList = in.readUTF().split("::::"); // 获取好友列表,使用标记分隔// 创建好友列表模型DefaultListModel list = new DefaultListModel();for (int i = 0; i < userList.length; i++) {list.addElement(userList[i]);}friends.setModel(list); // 设置模型friends.validate(); // 重绘
}
发送消息给某个好友:
out.writeUTF("message");
out.writeUTF(sender);
out.writeUTF(recipient);
out.writeUTF(textArea.getText());
out.flush();
开启新线程读取服务器转发的好友信息:
String flag = in.readUTF();
if ("message".equals(flag)) {String sender = in.readUTF();String msg = in.readUTF();String message = sender + " 对你说:" + msg + "\n";jTextArea.append(message);
}
运行效果图:
服务器效果:
客户端效果:
源代码:http://download.csdn.net/download/zhliro/8657263