首页 > 编程语言 >Java-Day-31( 多用户即时通信系统 —— 无异常退出 + 私聊 + 群发 )

Java-Day-31( 多用户即时通信系统 —— 无异常退出 + 私聊 + 群发 )

时间:2023-07-10 22:13:02浏览次数:42  
标签:Java socket 私聊 线程 退出 message 群发 客户端

Java-Day-31

多用户即时通信系统

无异常退出

  • 问题指出:

    • 客户端输入 9 退出的是输出在控制台的主线程,退出的是主菜单,并没有真正的退出
    • 因为客户端启动后,相当于是开启了一个进程,在这个进程中启动了一个主线程 ( main 线程 ),在 main 主线程中又启动了一个客户端的线程 ( ClientConnectServerThread,即和服务端通信的线程 ),此线程 run 方法是在不断循环的
    • 所以在输入 9 退出了 main 主线程,那个不断循环的 ClientConnectServerThread 并没有退出
  • 解决方法之一:

    • 客户端:

      • 在 main 线程调用方法,给服务器端发送一个退出系统的 message
      • 调用 System.exit(0) // 正常退出,直接关闭掉进程,从而此进程下的所有的线程就都结束了
    • 服务端器:

      • 服务器端和某个客户端通信的线程接收到一个退出系统的 message
      • 把这个线程持有的 socket 关闭
      • 退出该线程的 run 方法 ( 退出 while 循环 ),就相当于退出了这个线程
  • 具体解决实现:

    • 在客户端的 UserClientService 里编写发送退出 message 的方法
      • 最好在获取输出流对象的时候,是从集合中拿到线程 —— 用户 id 得到所属 socket 的线程来获取:ObjectOutputStream oos = new ObjectOutputStream(ManageClientConnectServerThread.getClientConnectServerThread(u.getUserId()).getSocket().getOutputStream());
      • 注意要传对 message 的 type,确保是放进了 setMesType 中
    • 服务端的 ManageClientThreads 中编写移除对应 userId 的线程对象的方法,在 ServerConnectClientThread 中调用此方法,并关闭此与用户连接的 socket,break 退出循环
      • 退出 run 方法,即退出所在的线程

私聊功能

  • 思路:
    • 客户端处,接收用户希望给其他用户聊天的内容,将消息构建成 Message 对象,通过对应 socket 发送给服务器
    • 服务器处,读取想私聊发送的信息,在管理线程的集合中,根据 message 的私聊信息接收者的 id,从而找到对应线程的 socket,然后将 message 对象转发给指定的客户
    • 指定的客户端处,读取 message 消息并显示
  • 客户端 ( 发送方 ):
    • 控制台输入接收方 id 和想发送的信息
    • 为更好区分,新建 MessageOtherClientService 用于编写发送消息的方法,即私聊 / 群聊所用
    • 方法里仍旧在新建存放完 message 后,为发送给服务端,通过用户 id,在集合中找到线程找到 socket 的输出流对象
  • 服务端:
    • serverConnectClientTreads 线程类中,接收如果是普通的信息发送,就根据接收方的 id 得到线程、socket、输出流对象
  • 客户端 ( 接收方 ):
    • UserClientService 判断如果是普通消息的发送,就直接拼接 message 的各个所需属性为字符串加以显示在控制台上

群聊

  • 同私聊的区别就是群聊不是指定对象发送,是直接遍历所有的在线线程

  • 服务端:需要遍历的时候就 get 方法拿到集合中的 HashMap,获取 key 遍历发送 message

  • 客户端:ClientConnectServerThread 线程随时 run 接收群发 Type,直接控制台输出 message 即可

标签:Java,socket,私聊,线程,退出,message,群发,客户端
From: https://www.cnblogs.com/zhu-ya-zhu/p/17542471.html

相关文章

  • Java-第一天(初始java)
    在正式学习Java之前,我们可以简单了解下Java进程......也可忽略喔一、Java发展历史Java是世界上使用最广泛的编程语言之一。Java最初由SunMicrosystems在1990年代开发,用于开发从Web应用程序到移动应用程序到批处理应用程序的所有内容。Java最初是一种纯粹的面向对象的语言,但现在......
  • ssm框架使springmvc放行资源(java配置类)
    在springmvc中,如果配置了拦截所有请求交给springmvc处理,会出现一些静态web资源加载不出来的情况,或者想放行指定web资源可以通过修改通过修改配置达到相应目的,这里使用覆写WebMvcConfigurationSupport中的方法作介绍。@ConfigurationpublicclassSpringMvcSupportextendsWeb......
  • 算法细节系列(1):Java swap
    算法细节系列(1):Javaswap问题在C++中,swap算法可以用指针来实现,因此在Java中,如果采用如下代码来对两个数字进行交换时,也不会影响两个对象的值。publicclassTestSwap{publicstaticvoidmain(String[]args){inta=2;intb=3;System.out.prin......
  • Java图片加水印
    分为文字水印和透明图片水印packagecom.qms.report.util;importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;publicclassImageWatermark{/***@paramwaterMarkType......
  • 每日汇报 第三周第二天 JAVA中的异常处理
    今日所学:掌握什么是异常;区分运行时异常和非运行时异常;掌握try、catch、finally后面代码块发挥的作用;掌握运用try-catch-finally捕获异常;掌握如何运用throws关键字在方法上抛出异常;掌握使用throw关键字为异常创建对象,进而主动印发某种异常明日计划:JAVA中的枚举与泛型......
  • java内存问题排查
    1.查看进程  输入:jps-v  输出:1jar-Xms2g-Xmx2g-XX:SurvivorRatio=4-XX:MetaspaceSize=256M-XX:MaxMetaspaceSize=256M-XX:MaxDirectMemorySize=256M-Dfile.encoding=UTF-8-Duser.timezone=GMT+08  可以查看机器上的java进程,1是进程ID,jar是进程名称,后面是一......
  • java串口通信
    java串口通信importjava.io.*;importjava.util.*;importgnu.io.*;publicclassSerialTestimplementsSerialPortEventListener{SerialPortserialPort;//串口名称privatestaticfinalStringPORT_NAME="/dev/ttyUSB0";//波特率priv......
  • JAVA集成velocity实现对已有模板替换(占位符变量)替换
      平时我们如果有一些简单的模板替换需求,比如有个txt文件,或者代码生成模板文件要根据传入的变量替换成具体的值就可以使用这个框架 依赖<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId>......
  • java类和对象学习总结
    当一个引用赋值为null的时候,就代表这个引用不指向任何的对象引用不能指向引用,只能说引用指向了另一个引用的对象.一个引用不能指向多个对象this引用的学习:代表的是当前对象的引用,每一个成员方法的第一个参数默认是thisthis.year this.month   加上this代表给当前的对象......
  • JavaScript加密:常见加密种类、优缺点和代码示例
    当涉及到JavaScript加密时,有多种加密算法和技术可供选择。下面我将列举一些常见的加密种类、它们的优缺点,并提供一些代码案例作为参考。对称加密算法:对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括AES(AdvancedEncryptionStandard)和DES(DataEncryptionS......