在 ManageServerConnectClientThread 中编写方法,返回在线用户列表
// 编写方法,返回在线用户列表
public static String getOnlineUser(){
// 通过 keySet() 方法进行遍历
Set<String> keys = map.keySet();
String onlineUserList = "";
for (String key : keys) {
onlineUserList += key + " ";
}
return onlineUserList;
}
在 ServerConnectClientThread 中添加拉取在线用户列表的业务逻辑
package com.qqserver.service;
import com.qqcommon.Message;
import com.qqcommon.MessageType;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
/**
* @Author: Gin
* @Description: 该类的一个对象和某个客户端保持通信
* @Modified By: Gin
* @Date: Created in 14:23 2021/10/14
*/
public class ServerConnectClientThread extends Thread{
private Socket socket;
private String userId; // 连接到服务端的用户 id
public ServerConnectClientThread(Socket socket, String userId) {
this.socket = socket;
this.userId = userId;
}
@Override
public void run() {
while(true){
try {
// 服务端线程,等待读取从客户端发送过来的消息
System.out.println("客户端" + userId + "和服务端保持通信,读取数据...");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// 如果服务端没有发送 Message 对象,则线程在这里会阻塞
Message msg = (Message) ois.readObject();
// 根据 msg 的类型,做相应的业务处理
if(MessageType.MESSAGE_GET_ONLINE_FRIEND.equals(msg.getMesType())){
// 客户端要在线用户列表
System.out.println(msg.getSender() + " 要在线用户列表...");
String onlineUser = ManageServerConnectClientThread.getOnlineUser();
// 得到在线用户列表,需要构建一个 Message 对象,来返回给客户端
Message message = new Message();
message.setMesType(MessageType.MESSAGE_RETURN_ONLINE_FRIEND);
message.setContent(onlineUser);
message.setGetter(msg.getSender());
// 通过 Socket 对象获取对象输出流,将 Message 对象放入数据通道
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(message);
}else{
System.out.println("其它类型的 Message 对象,暂不处理...");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
测试:拉取在线用户列表
启动服务端,启动 3 个客户端
每个客户端登录不同的用户,都执行拉取在线用户列表功能