day04-1群聊功能
多用户即时通讯系统04
4.编码实现03
4.5功能实现-群聊功能实现
4.5.1思路分析
群聊的实现思路和私聊的实现非常类似。
不同的是:私聊时,服务端接收到消息后,只需要找出接收方的socket并发送消息即可
群聊时,服务端在接收到消息后需要遍历集合中所有的线程,找出除了发送方的所有客户端的socket,并发送消息
群聊思路:
- 客户端 - 发送者:
- 用户在控制台输入信息,客户端接收内容
- 将消息构建成Messgae对象,通过对应的socket发送给服务器
- 服务器:
- 读取客户端(发送者)发送给所有用户(接收者)的消息
- 从管理线程的集合中,遍历所有线程,获取所有socket(除了发送者本身)
- 将Message对象转发给所有的接收者
- 客户端 - 所有接收者:
- 所有接受者分别在线程(通信线程)中,读取到发送者的message消息,并显示即可
4.5.2代码实现
1.客户端:
1.修改MessageType接口
在接口中增加新的消息类型
String MESSAGE_TO_ALL_MES = "7";//表示群发消息包
2.修改MessageClientService类
在该类中增加sendMessageToAll方法,实现群发功能
/**
* 群发消息功能
* @param content 内容
* @param senderId 发送者
*/
public void sendMessageToAll(String content,String senderId){
//构建 message
Message message = new Message();
message.setMesType(MessageType.MESSAGE_TO_ALL_MES);//设置消息类型是群发消息
message.setSender(senderId);
message.setContent(content);
message.setSendTime(new Date().toString());//发送时间也封装到 message对象中
System.out.println(senderId + " 对大家说 " + content);
//发送给服务端
try {//在管理线程的集合中,通过userId来获取线程,通过线程来获取对应的socket,再通过socket获取输出流
ObjectOutputStream oos =
new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(senderId).getSocket().getOutputStream());
oos.writeObject(message);
} catch (IOException e) {
e.printStackTrace();
}
}
3.修改ClientConnectServerThread类
在该类的run方法中增加新的逻辑业务,增加接收群发消息类型的判断,并在控制台显示
else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
//接收到的是群发的消息
//就把服务器转发的消息,显示到控制台即可
System.out.println("\n" + message.getSendTime() + "\n" + message.getSender()
+ " 对大家说: " + "\n" + message.getContent());
}
4.修改QQView类
在该类的内层循环中,调用群发功能的方法:
case "2":
System.out.println("请输入想对大家说的话");
String s = Utility.readString(100);
//调用一个方法,将消息封装成 message对象,发给服务端
messageClientService.sendMessageToAll(s,userId);
break;
2.服务端:
1.修改MessageType接口
在接口中增加新的消息类型
String MESSAGE_TO_ALL_MES = "7";//表示群发消息包
2.修改ServerConnectClientThread类
在该类中增加新的业务逻辑
else if (message.getMesType().equals(MessageType.MESSAGE_TO_ALL_MES)) {
//业务四:客户请求群发消息需要遍历管理线程的集合,把所有线程的socket都得到,然后将 message进行转发即可
//得到hm
HashMap<String, ServerConnectClientThread> hm = ManageClientThreads.getHm();
//遍历
Iterator<String> iterator = hm.keySet().iterator();
while (iterator.hasNext()) {
//取出所有userId
String onlineUserId = iterator.next().toString();
//取出除了发送者的所有用户id
if (!onlineUserId.equals(message.getSender())) {
//转发message
//从集合中取出线程,在线程中取出socket,根据socket获得输出流,将socket的输出流转化为对象输出流
ObjectOutputStream oos =
new ObjectOutputStream(hm.get(onlineUserId).getSocket().getOutputStream());
oos.writeObject(message);
}
}
}
3.修改ManageClientThreads类
在该类中增加方法,获取集合
//返回hashmap
public static HashMap<String ,ServerConnectClientThread> getHm(){
return hm;
}
运行程序:
1.运行服务端,进行监听
2.运行三个客户端,登录三个用户
3.在 用户uid=100 的账号发送群发消息
4.其他用户也接收到了消息
5.服务器端
功能实现完毕
day04-1群聊功能的更多相关文章
- Java-->实现群聊功能(C/S模式--TCP协议)
--> Java 对TCP协议的支持: --> java.net包中定义了两个类ServerSocket 和Socket ,分别用来实现双向连接的server 端和client 端. -- ...
- Asp.net SignalR 应用并实现群聊功能 开源代码
ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
- netty实现群聊功能
[概述] 实现一个网络群聊工具.参与聊天的客户端消息是通过服务端进行广播的. 主要由两块组成:聊天服务器端(ChatServer)和聊天客户端(ChatClient). 聊天服务器(ChatServe ...
- java项目-----客户端与客户端通信--实现群聊功能的代码
这是这个网络聊天室项目的原理图: 很简单,首先ABCD是4个客户端,当A发送信息给服务器,服务器实现以广播的形式把信息全发给每个人---群发群聊 客户端代码: package com.aa; impo ...
- netty无缝切换rabbitmq、activemq、rocketmq实现聊天室单聊、群聊功能
netty的pipeline处理链上的handler:需要IdleStateHandler心跳检测channel是否有效,以及处理登录认证的UserAuthHandler和消息处理MessageHan ...
- Websocket 群聊功能
websocket 群聊 前提关闭防火墙 写入代码 from flask import Flask,request,render_template from geventwebsocket.handl ...
- 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能
1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块 修改了start 脚本 nodemo ...
- Java网络编程Demo,使用TCP 实现简单群聊功能GroupchatSimple,多个客户端输入消息,显示在服务端的控制台
效果: 服务端 客户端 实现代码: 服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Sock ...
随机推荐
- 练习-使用日期时间相关的API ,计算出一个人已经出生了多长时间
程序分析:(1)使用Scanner类获取出生日期(2)使用DataFormat类中的方法parse,把字符串的出生日期解析为Data格式的出生日期(3)把Data格式的出生日期转化为毫秒值(4)获取当 ...
- HMS Core音频编辑服务支持7种音频特效,助力一站式音频处理
多媒体时代,音频作为内容传播中的重要形式,因其不受空间限制.认知负担小.声音元素多样化等特点,广泛应用于短视频制作.儿童在线教育.有声阅读.游戏等领域产品,在各种形式的音频呈现过程中,合理添加音效能够 ...
- error: cannot open .git/FETCH_HEAD: Permission denied
可能原因:该操作的执行者对该目录没有写权限 解决:1.类Unix平台,使用chown将目录改为自己: 2.Windows平台,取消只读选项,给everyone用户所有权限:
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...
- P4315 月下“毛景树”(树链剖分)
P4315 月下"毛景树"(树链剖分) 题面 简述: 边权转点权(在dfs1处转换) 把一条边权赋值在深度更深的上 需要实现对单边权的染色 , 路径边权的染色 , 路径边权的增加 ...
- [MRCTF2020]套娃-1
1.打开之后未发现有用的信息,右键检查源代码信息,发现部分代码信息,结果如下: 2.对代码进行分析:$_SERVER['QUERY_STRING']:指的是查询的字符串,即地址栏?之后的部分,%5f指 ...
- Apache DolphinScheduler 是如何诞生的
作者 | 代立冬,李岗 排版 | 开源之道小助理 Apache DolphinScheduler,简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左 ...
- Linux 01 概述
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 简介 Linux ...
- FTP 基础 与 使用 Docker 搭建 Vsftpd 的 FTP 服务
FTP 基础 与 使用 Docker 搭建 Vsftpd 的 FTP 服务 前言 最近的工作中,需要将手机上的文件发送到公司的 FTP 的服务器.按照从前的思路,自然是,先将文件传到电脑,再由电脑上传 ...
- Host long.com not found: 2(SERVFAIL)
环境: centos 7.9 地址:192.168.200.100 相关配置 name.conf文件: named.zones文件: 正反解析文件: 重启DNS服务: 1 [root@server ...