当前位置: 首页 > news >正文

网络多线程开发小项目--QQ登陆聊天功能(私聊群发)

9.1.4、QQ登陆聊天功能(私聊群发)

9.1.4.1、私聊功能

1、需求说明
在这里插入图片描述
2、思路分析
在这里插入图片描述
3、代码实现
QQClient:
1)cn.com.agree.qqclient.QQView.QQView

  case "3":log.debug("请输入想给谁发消息(在线用户):");String getterId = Utility.readString(50).trim();log.debug("请输入想说的话:");content = Utility.readString(200).trim();//TODO 私聊bug invalid type code: AC已解决    messageClientService.sendMsgToOne(getterId,userId,content);                                        

2)cn.com.agree.qqclient.message.MessageClientService

 /*** 私聊* @param getterId 接收方id* @param senderId 发送方id* @param content  消息内容*/public void sendMsgToOne(String getterId,String senderId,String content){//创建Message对象Message message = new Message();message.setMsgType(MessageType.MESSAGE_COMM_MS);//对话,普通消息message.setGetter(getterId);message.setSender(senderId);message.setContent(content);message.setSendTime(new Date().toString());log.debug(senderId+" 对 "+getterId+" 说: "+content);//获取socket流发送message消息try {ObjectOutputStream oos = new MyObjectOutputStream(ManageClientConnectServers.getClientConnectServer(senderId).getSocket().getOutputStream());oos.writeObject(message);} catch (IOException e) {e.printStackTrace();}}

3)cn.com.agree.qqclient.service.ClientConnectServer

  case MessageType.MESSAGE_COMM_MS:log.debug(message.getSender()+" 对 "+message.getGetter()+" 说: "+message.getContent());break;

QQServer:
1)cn.com.agree.qqserver.service.ServerConnectClient

 case MessageType.MESSAGE_COMM_MS:log.debug("message:{}", message);log.debug(message.getSender() + " 对 " + message.getGetter() + " 说: " + message.getContent());//转发消息ObjectOutputStream oos2 = new MyObjectOutputStream(ManageServerConnectClient.getServerConnectClient(message.getGetter()).getSocket().getOutputStream());oos2.writeObject(message);//如果用户不在线,可以保存到数据库做离线转发break;

4、运行效果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.1.4.2、群发功能

1、需求说明
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/8c3f9b545d4c4dffb16e9b5e3d9642ae.p

2、思路分析
在这里插入图片描述
3、代码实现
Common:
cn.com.agree.qqcommon.MessageType

String MESSAGE_ONLINEAll_MS="7";//群发消息

QQClient:
1)cn.com.agree.qqclient.QQView.QQView

 case "2"://TODO 群发bug invalid type code: AC待解决log.debug("请输入要说的内容:");String content = Utility.readString(100);messageClientService.sendMsgToAll(userId,content);// System.out.println("群发消息");break;

2)cn.com.agree.qqclient.message.MessageClientService

 /*** 群发* @param* @param senderId 发送方id* @param content  消息内容*/public void sendMsgToAll(String senderId,String content){//创建Message对象Message message = new Message();message.setMsgType(MessageType.MESSAGE_ONLINEAll_MS);//对话,普通消息message.setSender(senderId);message.setContent(content);message.setSendTime(new Date().toString());log.debug(senderId+" 对 "+"大家说: "+content);//获取socket流发送message消息try {ObjectOutputStream oos = new MyObjectOutputStream(ManageClientConnectServers.getClientConnectServer(senderId).getSocket().getOutputStream());oos.writeObject(message);} catch (IOException e) {e.printStackTrace();}}

3)cn.com.agree.qqclient.service.ClientConnectServer

 case MessageType.MESSAGE_ONLINEAll_MS:log.debug(message.getSender() + " 对 " +"大家说: " + message.getContent());break;

QQServer:
cn.com.agree.qqserver.service.ServerConnectClient

case MessageType.MESSAGE_ONLINEAll_MS:log.debug("message:{}", message);log.debug(message.getSender() + " 对 " + "大家说: " + message.getContent());//遍历服务端线程集合获取非发送方的线程socket进行消息转发Map<String, ServerConnectClient> hm = ManageServerConnectClient.getHm();Iterator<String> userIds = hm.keySet().iterator();while (userIds.hasNext()) {String userId = userIds.next().toString();if (!userId.equals(message.getSender())) {//获取非发送方的用户idServerConnectClient serverConnectClient = hm.get(userId);//获取socket进行消息转发ObjectOutputStream oos3 = new MyObjectOutputStream(serverConnectClient.getSocket().getOutputStream());oos3.writeObject(message);}}break;

4、运行结果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意:上述 invalid type code: AC异常
分析:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解决
在这里插入图片描述
第三种解决方案代码
cn.com.agree.stream.MyObjectInputStream

package cn.com.agree.stream;import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;/*** @author * @version 1.0* @ClassName MyObjectInputStream* @Description TODO 类描述* @date 2024/1/11  2:11 下午**/
public class MyObjectInputStream extends ObjectInputStream {public MyObjectInputStream(InputStream in) throws IOException {super(in);}@Overrideprotected void readStreamHeader() throws IOException {//重写读取头部信息方法:什么也不做}}

cn.com.agree.stream.MyObjectOutputStream

package cn.com.agree.stream;import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;/*** @author * @version 1.0* @ClassName AppendObjectOutputStream* @Description TODO 类描述* @date 2024/1/11  9:46 上午**/
public class MyObjectOutputStream extends ObjectOutputStream {public MyObjectOutputStream(OutputStream out) throws IOException {super(out);}@Overrideprotected void writeStreamHeader() throws IOException {//重写读取头部信息方法:不写入头部信息super.reset();}
}
http://www.lryc.cn/news/277970.html

相关文章:

  • 企业版多域名SSL证书
  • 理解Herbrand Equivalence
  • 【SimPy系列博客之官方example学习与解读】—— Example 3: Car Wash
  • 前端随机验证码安全验证sdk
  • 语境化语言表示模型
  • PDO【配置】
  • CMake入门教程【高级篇】管理MSVC编译器警告
  • 【JaveWeb教程】(8)Web前端基础:Vue组件库Element之Table表格组件和Pagination分页组件 详细示例介绍
  • llama_index 创始人为我们展示召回提升策略(提升15%)
  • RAG 详解
  • 【llm 部署运行videochat--完整教程】
  • Talking about likes
  • DeepSeek 发布全新开源大模型,数学推理能力超越 LLaMA-2
  • 代码随想录算法训练营第二十一天| 回溯 216. 组合总和 III 17. 电话号码的字母组合
  • 微服务架构最佳实践
  • 国内首款支持苹果Find My芯片-伦茨科技ST17H6x
  • linux 01 centos镜像下载,服务器,vmware模拟服务器
  • Linux安装RabbitMq明白纸(无图)
  • Android - CrashHandler 全局异常捕获器
  • 商品源数据如何采集,您知道吗?
  • 输入输出流、字符字节流、NIO
  • js中对数字,超大金额(千位符,小数点)格式化处理
  • Android 打开热点2.4G系统重启解决
  • 全链路压力测试有哪些主要作用
  • 【python基础教程】print输出函数和range()函数的正确使用方式
  • LeetCode255.用队列实现栈
  • PHPStudy快速搭建网站并结合内网穿透远程访问本地站点
  • AI嵌入式K210项目(1)-芯片开发板介绍
  • Blazor中使用impress.js
  • ros2 ubuntu 20.04 安装 foxy