使用Socket编程实现即时通讯主要涉及以下步骤:
- 建立长连接:客户端和服务端建立Socket长连接,用于随时传送消息。
- 用户登录:客户端登录到服务端,绑定用户标识,如用户名。
- 用户列表更新:服务端维护在线用户列表,用户上线下线时更新列表,并推送给所有在线客户端。
- 用户发消息:用户输入消息后,客户端将消息推送到服务端。服务端校验消息后广播给目标用户。
- 消息展示:客户端接收到推送的消息后,在聊天界面实时展示。
- 用户退出:用户退出登录时,客户端关闭Socket连接,服务端更新在线用户列表并广播。
- 心跳检测:客户端定时发送心跳包到服务端,验证连接是否正常。超过一定时间未收到心跳,视为客户端离线。
代码示例:
// 服务端
ServerSocket server = new ServerSocket(8000);
List<Socket> sockets = new ArrayList<>();
Map<String, Socket> users = new HashMap<>();
while (true) {
Socket socket = server.accept();
sockets.add(socket);
// 用户登录
String username = readUsername(socket);
users.put(username, socket);
// 广播用户列表更新
broadcast(sockets, getOnlineUserList());
}
// 广播消息
String msg = readMessage(socket);
Socket target = users.get(msgTarget);
forwardMessage(msg, target);
// 用户退出
String username = readUsername(socket);
users.remove(username);
broadcast(sockets, getOnlineUserList());
sockets.remove(socket);
// 客户端
Socket socket = new Socket("127.0.0.1", 8000);
// 登录
sendUsername(socket, "Tom");
// 展示在线用户列表和消息
String data = readData(socket);
showOnlineUsers(data);
// 发消息
sendTargetAndMessage(socket, "Jerry", "Hello!");
// 展示接收到的消息
String msg = readData(socket);
showMessage("Jerry", msg);
// 定期发送心跳包
while (online) {
sendHeartBeat(socket);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 退出登录并关闭连接
sendLogout(socket);
socket.close();
上述只是一个简单的示例,实际上,即时通讯还需要对消息历史、离线消息、连接断线重连等进行处理,同时还需要加密、签名等机制来保证通讯安全。但Socket提供了其基本的数据传输能力。