客户端
- 接收用户希望给某个其它在线用户聊天的内容。
- 将消息构建成 Message 对象,通过对应的 socket 发送给服务器
- 在他的线程(通信线程中),读取到发送的 message 消息,并显示即可
服务端
- 可以读取到客户端发送给某个客户的消息
- 从管理线程的集合中,根据 message 对象的 getterId 获取到对应线程的 socket
- 然后将 message 对象转发给指定客户
QQView
创建 MessageClientService 类,来提供和消息相关的方法
package com.qqclient.service;
import com.qqcommon.Message;
import java.io.ObjectOutputStream;
import java.util.Date;
/**
* @Author: Gin
* @Description: 该类提供和消息相关的方法
* @Modified By: Gin
* @Date: Created in 15:09 2021/10/19
*/
public class MessageClientService {
/**
* @param content 内容
* @param senderId 发送者
* @param getterId 接收者
*/
public void sendMessageToOne(String content, String senderId, String getterId){
// 构建 Message
Message message = new Message();
message.setMesType(MessageType.MESSAGE_COMM_MES); // 设置消息类型为普通聊天消息
message.setSender(senderId);
message.setGetter(getterId);
message.setContent(content);
message.setSendTime(new Date().toString()); // 将时间封装到 message 对象中
System.out.println(senderId + " 对 " + getterId + " 说:" + content); // 客户端提示信息
// 将 message 对象发送给服务端
try {
ObjectOutputStream oos =
new ObjectOutputStream(
ManageClientConnectServerThread.getClientConnectServerThread(senderId).
getSocket().getOutputStream());
oos.writeObject(message);
} catch (Exception e){
e.printStackTrace();
}
}
}
在 ServerConnectClientThread 类中添加新的分支,还要补充 getSocket() 方法
else if(MessageType.MESSAGE_COMM_MES.equals(msg.getMesType())){
// 根据 msg 获取 getterId,然后再得到对应线程
ServerConnectClientThread serverConnectClientThread
= ManageServerConnectClientThread.getServerConnectClientThread(msg.getGetter());
// 得到对应 socket 的对象输出流,将 msg 对象转发给指定客户端
ObjectOutputStream oos
= new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
// 将 msg 发送出去
oos.writeObject(msg);
// 此处扩展:如果指定客户端不在线,可将信息保存到数据库,以实现离线留言
}
在 ClientConnectServerThread 类中添加新的分支
else if(MessageType.MESSAGE_COMM_MES.equals(msg.getMesType())){
// 如果消息类型为 普通消息,则把从服务器转发的消息显示到控制台即可
System.out.println(msg.getSender() + " 对 " + msg.getGetter() + " 说:" + msg.getContent());
}
QQView 中调用方法