网络多线程——多用户即时通信系统(13)——服务端推送新闻

服务端

服务端

  1. 推送消息/新闻,本质其实就是群发消息
  2. 在服务器启动一条独立线程,专门负责推送新闻

在服务器端添加 Utility 工具类

在这里插入图片描述

在服务端新建 SendNewsToAllService 类



package com.qqserver.service;

import com.qqcommon.Message;
import com.utils.Utility;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 16:20 2021/10/20
 */
public class SendNewsToAllService implements Runnable{

    @Override
    public void run() {
        while(true){
            System.out.println("请输入服务器要推送的新闻/消息(输入 exit 表示退出推送消息的线程):");
            String news = Utility.readString(100);
            if("exit".equals(news)){
                break;
            }
            // 构建一个消息,消息类型为群发消息
            Message message = new Message();
            message.setSender("服务器");
            message.setContent(news);
            message.setSendTime(new Date().toString());
            System.out.println("服务器推送消息给所有人,说:" + news);
            // 遍历当前所有的线程,得到 socket,发送 message
            HashMap<String, ServerConnectClientThread> map = ManageServerConnectClientThread.getMap();
            Iterator<String> iterator = map.keySet().iterator();
            while (iterator.hasNext()) {
                String onlineUserId = iterator.next().toString();
                try {
                    ObjectOutputStream oos = new ObjectOutputStream(
                            map.get(onlineUserId).getSocket().getOutputStream());
                    oos.writeObject(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}



在 QQServer 中启动 推送消息 的线程:

在这里插入图片描述

测试:

服务端:

在这里插入图片描述

客户端1:

在这里插入图片描述

客户端2:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值