QQClient:
0、cn.com.agree.qqcommon.MessageType
package cn.com.agree.qqcommon;
/**
* @author
* @version 1.0
* @ClassName MessageType
* @Description TODO 类描述
* @date 2024/1/5 10:35 上午
**/
public interface MessageType {
//消息类型
//1、在消息类型中定义一些常量
//2、不同的常量值代表不同的消息类型
String MESSAGE_LOG_SUCCESS = "1";//表示登陆成功
String MESSAGE_LOG_FAIL = "2";//表示登陆失败
String MESSAGE_COMM_MS="3";//普通消息
String MESSAGE_GET_ONLINE_FIRED="4";//要求返回在线用户列表
String MESSAGE_RET_ONLINE_FIRED="5";//返回在线用户列表
String MESSAGE_CLIENT_EXIT="6";//客户端请求退出
}
1、界面QQView
if (user != null) {
System.out.println("==========欢迎" + userId + "用户=============");
while (loop) {
System.out.println("==========网络通讯系统二级菜单(用户 " + userId + ")============");
System.out.println("=======\t\t 1 显示在线用户列表================");
System.out.println("=======\t\t 2 群发消息\t\t================");
System.out.println("=======\t\t 3 私聊消息\t\t================");
System.out.println("=======\t\t 4 发送文件\t\t================");
System.out.println("=======\t\t 9 退出系统\t\t================");
log.debug("请输入你的选择:");
key = Utility.readString(1);
switch (key) {
case "1":
//System.out.println("显示在线用户列表");
userClientService.DisplayOnlineUserList();
break;
case "2":
System.out.println("群发消息");
break;
case "3":
System.out.println("私聊消息");
break;
case "4":
System.out.println("发送文件");
break;
case "9":
loop = false;
break;
default:
log.debug("输入有误,请重新输入!");
break;
}
}
} else {
log.debug("=========用户名密码错误=============");
log.debug("==========登陆失败=============");
}
break;
case "9":
loop = false;
break;
default:
log.debug("输入有误,请重新输入!");
break;
}
}
2、cn.com.agree.qqclient.service.UserClientService
public void DisplayOnlineUserList(){
//构建要发送的信息 MESSAGE_GET_ONLINE_FIRED
Message message = new Message();
message.setMsgType(MessageType.MESSAGE_GET_ONLINE_FIRED);
message.setGetter(user.getUserId());
ObjectOutputStream oos;
//获取该用户的socket输出流
try {
oos = new ObjectOutputStream(ManageClientConnectServers.getClientConnectServer(user.getUserId()).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
3、cn.com.agree.qqclient.service.ClientConnectServer
@Override
public void run() {
//因为Thread需要在后台和服务器进行通信,因此我们用while循环
while (true) {
try {
log.debug("客户端线程和服务端正在通信,读取从服务端发来的消息...");
// 设置Socket的超时时间为5000毫秒(5秒)
// socket.setSoTimeout(5000);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message message = (Message) ois.readObject();//如果服务器端没有消息发过来这个线程一直会阻塞在这里
//todo 后续对读取到的message进行处理
switch (message.getMsgType()){
case MessageType.MESSAGE_RET_ONLINE_FIRED:
String[] userList = message.getContent().split(" ");
log.debug("====获取到的在线用户列表=====");
for (String user : userList) {
log.debug("user:{}",user);
}
break;
default:
log.debug("其他消息类型暂不处理");
break;
}
log.debug("message:{}",message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
QQServer:
0、cn.com.agree.qqcommon.MessageType
package cn.com.agree.qqcommon;
/**
* @author
* @version 1.0
* @ClassName MessageType
* @Description TODO 类描述
* @date 2024/1/5 10:35 上午
**/
public interface MessageType {
//消息类型
//1、在消息类型中定义一些常量
//2、不同的常量值代表不同的消息类型
String MESSAGE_LOG_SUCCESS = "1";//表示登陆成功
String MESSAGE_LOG_FAIL = "2";//表示登陆失败
String MESSAGE_COMM_MS="3";//普通消息
String MESSAGE_GET_ONLINE_FIRED="4";//要求返回在线用户列表
String MESSAGE_RET_ONLINE_FIRED="5";//返回在线用户列表
String MESSAGE_CLIENT_EXIT="6";//客户端请求退出
}
1、cn.com.agree.qqserver.service.ServerConnectClient
public void run() {
while (true) {
try {
log.debug("服务端和客户端" + userId + "正在通信通信,读取数据...");
// 设置Socket的超时时间为5000毫秒(5秒)
// socket.setSoTimeout(5000);
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Message message = (Message) ois.readObject();
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
//TODO 后续处理从客户端获取的消息
log.debug("message:{}", message);
log.debug(userId+"要在用户列表");
switch (message.getMsgType()) {
case MessageType.MESSAGE_GET_ONLINE_FIRED:
String users = ManageServerConnectClient.getOnlineUsers();
Message message2 = new Message();
message2.setContent(users);
message2.setSender(message.getGetter());
message2.setMsgType(MessageType.MESSAGE_RET_ONLINE_FIRED);
oos.writeObject(message2);
break;
default:
log.debug("其他类型暂不处理");
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、cn.com.agree.qqserver.service.ManageServerConnectClient
package cn.com.agree.qqserver.service;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @author
* @version 1.0
* @ClassName ManageServerConnectClient
* @Description TODO 类描述
* @date 2024/1/5 5:50 下午
**/
public class ManageServerConnectClient {
private static Map<String, ServerConnectClient> hm = new HashMap();
public static void addServerConnectClient(String userId, ServerConnectClient serverConnectClient) {
hm.put(userId, serverConnectClient);
}
public static ServerConnectClient getServerConnectClient(String userId) {
return hm.get(userId);
}
public static String getOnlineUsers() {
String users = "";
Iterator<String> iterator = hm.keySet().iterator();
while (iterator.hasNext()) {
users += iterator.next();
users+=" ";
}
return users;
}
}
运行效果图: