如何使用 Socket 编程实现即时通讯?

使用Socket编程实现即时通讯主要涉及以下步骤:

  1. 建立长连接:客户端和服务端建立Socket长连接,用于随时传送消息。
  2. 用户登录:客户端登录到服务端,绑定用户标识,如用户名。
  3. 用户列表更新:服务端维护在线用户列表,用户上线下线时更新列表,并推送给所有在线客户端。
  4. 用户发消息:用户输入消息后,客户端将消息推送到服务端。服务端校验消息后广播给目标用户。
  5. 消息展示:客户端接收到推送的消息后,在聊天界面实时展示。
  6. 用户退出:用户退出登录时,客户端关闭Socket连接,服务端更新在线用户列表并广播。
  7. 心跳检测:客户端定时发送心跳包到服务端,验证连接是否正常。超过一定时间未收到心跳,视为客户端离线。

代码示例:

// 服务端
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提供了其基本的数据传输能力。