韩顺平30天javaQQ通信作业扩展-完成离线提醒及接收接收

韩顺平30天javaQQ通信作业扩展-完成用户离线提醒及接收接收。对应708集
摘要由CSDN通过智能技术生成

我这里只显示需要添加的代码,其余代码与韩老师写的一样。

这里用户1发短信给用户2

大体思路:1.在服务器接收用户1输入信息ObjectInputStream的时候有两个分支(if-else),

第一,如果在线程池里用户2不存在,就把输入信息保存在concurrentHashMap

第二,如果线程池里存在用户2,就把输入信息通过ObjectOutputStream.WriteObject发给客户端。

2.在服务器,用户2发送登录成功MessageType给客户端的时候,同时把用户1的信息也发出去,通过message.setContent()。

建议自己在想一下,因为很简单,具体代码如下:

1.设定属性.private static ConcurrentHashMap<String, ArrayList<Message>>ofLineDb = new ConcurrentHashMap<>();

2.写方法用来保存内容

public static void dbmessage(String userId,Message message1){

        if (!ManageClientThread.getHm().containsKey(userId)){

        ArrayList<Message> messages1 = new ArrayList<>();

        messages1.add(message1); ofLineDb.put(userId,messages1);

}

3.服务器对收到的信息进行分流
else if (o1.getMesType().equals(MessageType.MESSAGE_COMM_MES.getNum())){
     //把客户端私聊的内容保存在dbmessage方法里的ConcurrentHashMap里
    if (!ManageClientThread.getHm().containsKey(o1.getGetter())) {
        o1.setContent("\n"+o1.getSender()+"发消息说"+o1.getContent());
        QQserver.dbmessage(o1.getGetter(), o1);

    }
        //传递给客户端,通过需要收到的用户id找到socket
        ServerConnectClientThread getserverconnectclietnthread = ManageClientThread.getserverconnectclietnthread(o1.getGetter());
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(getserverconnectclietnthread.getSocket().getOutputStream());
            objectOutputStream.writeObject(o1);  }

4.在服务器,当用户2登入时,从数组里取出用户1的信息打包过去。

if (ofLineDb.get(o1.getUserId())!=null){
    ArrayList<Message> messages = ofLineDb.get(o1.getUserId());
    Iterator<Message> iterator = messages.iterator();
    while (iterator.hasNext()) {
        Message next = iterator.next();
        message.setContent(next.getContent());


    }
}

5.客户端里输出

if (ManageClientConnectiServerThread.getccst(message.getGetter())==null){System.out.println(message.getGetter()+"用户已经离线");}else
{ System.out.println(senderId+"对"+getterId+"说"+content);}

服务器端的:


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() {//这里线程处于rum的状态,可以发送/接送消息
        while(true){
            System.out.println("服务端和客户端"+userId+"保持通信,读取数据...");
            try {
                ObjectInputStream objectInputStream = new Objec
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

业余JAVA爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值