实现聊天室应该将内容分为两个模块,客户端模块和服务器模块;
一.服务端创建
1.1 ServletSocket,并绑定端口号;

 ServerSocket serverSocket  = new ServerSocket(6320);System.out.println("服务器启动 "+ serverSocket.getLocalSocketAddress());

1.2 创建一个存储连接用户的线程池
为了使连接上的客户都创建一个线程,为了不创建多余线程使用线程池循环使用,线程数量通过拟定同时在线最大数量决定,通过循环不停监听是否有用户接入,并创建线程,通过复用拥有Runnable接口的HandClient类处理业务;

 ExecutorService executorService =Executors.newFixedThreadPool(25);while(true){Socket client = serverSocket.accept();System.out.println("有客户端连接到服务器"+client.getRemoteSocketAddress());executorService.execute(new HandClient(client));}

二.客户端创建
2.1创建Socket连接,本地与服务器

Socket client = new Socket("127.0.0.1",6320);

2.2将客户端的接收和发送信息分为两个线程,因为是两个不同的业务逻辑,而且不需要多余线程,所以用继承Thread的方式实现两个线程

new ReadData(client).start();
new WriteData(client).start();

三.具体类实现
3.1聊天室实现功能

3.1.1利用命令行的交互式输入输出,需要服务端能够进行一下操作:
1.在服务端进行注册和登录;
2.客户端通过服务端可以和在线所有客户发起群聊
3.通过服务端和指定客户进行私聊

3.1.2利用命令行的交互式输入输出,需要服务端能够进行一下操作:
1.对服务端进行输入
2.接收服务端返回数据
3.收到退出命令关闭服务端

3.2HandClient实现
3.2.1
HandClient就是对具体事务的实现,首先要拥有一个统计在线所有接收到的Socket类对象,利用ConcurrentHashMap<String,Socket>实现,String用于存储用户名利用Map的Key不能重复原则,禁止取相同用户名;
HandClient还拥有一个记录当前Socket对象的属性client;
注册时加入Map,用户退出时取出

private static final Map<String, Socket> ONLINE_CLIENT_MAP =new ConcurrentHashMap<>();private final Socket client;

3.2.2
通过对客户端发送过来的字符串进行拆解,分析得到此时服务端应该进行的操作,以下是字符串格式以及处理

 @Overridepublic void run() {try {InputStream clientInput = client.getInputStream();Scanner scanner = new Scanner(clientInput);/*消息按行读取1.register:<username>  例如:register:张三                        注册2.groupChat:<message>   例如:groupChat:大家好                    群聊3.privateChat:<username>:<message> 例如:privateChat:张三:你好    私聊4.bye                                                           退出*/while (true) {String date = scanner.nextLine();if (date.startsWith("register:")) {//注册String username = date.split(":")[1];register(username);continue;}if (date.equals("bye")) {//退出bye();break;}if (date.startsWith("groupChat:")) {String message = date.split(":")[1];groupChat(message);continue;}if (date.startsWith("privateChat:")) {String[] segment = date.split(":");String targetUser = segment[1];String message = segment[2];privateChat(targetUser, message);continue;}}} catch (IOException e) {e.printStackTrace();}}

以上是HandClient主要思路,具体程序https://github.com/zjgyjd/JavaLearn/blob/master/chat-room/chat-room-server/src/com/github/zjgyjd/server/mul/HanderClient.java

3.3客户端实现
客户端暂时只实现接收和发送数据
3.3.1接收服务器返回字符

package com.github.zjgyjd.client.mul;import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.Scanner;public class ReadData extends Thread {private final Socket client;public ReadData(Socket client) {this.client = client;}@Overridepublic void run() {try {InputStream message = client.getInputStream();Scanner scanner = new Scanner(message);while (true) {String m = scanner.nextLine();if (!m.equals("bye")) {System.out.println(m);}else{this.client.close();break;}}} catch (IOException e) {e.printStackTrace();}}
}

3.3.2向服务器发送字符

package com.github.zjgyjd.client.mul;import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;public class WriteData extends Thread {private final Socket client;public WriteData(Socket client) {this.client = client;}@Overridepublic void run() {try {OutputStream clientOutput = this.client.getOutputStream();OutputStreamWriter writer = new OutputStreamWriter(clientOutput);Scanner scanner = new Scanner(System.in);while(true){String data = scanner.nextLine();writer.write(data+"\n");writer.flush();if(data.equals("bye")){break;}}} catch (IOException e) {e.printStackTrace();}}
}

多线程Java聊天室相关推荐

  1. Java实现多线程局域网聊天室

    Java多线程局域网聊天室 局域网聊天室 1.TCP 2.套接字 3.C/S架构 4.多线程 5.服务器 客户端 局域网聊天室 在学习了一个学期的java以后,觉得java真是博大精深,彻底放弃了因为 ...

  2. [java聊天室]多个客户端与服务器说话多线程(二)

    多客户端链接 之前(java聊天室一)只有第一个连接的客户端可以与服务端说话. 原因: 服务端只调用过一次accept方法,因此只有第一个客户端链接时服务端接受了链接并返回了Socket,此时可以与其 ...

  3. 多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...

    #java    聊天室(一)--  实现一个简单Telnet多人群聊聊天室 学习本文须要先准备的知识点:队列(或数组).类与对象.线程.InputStream和OutputStream的使用.jav ...

  4. java聊天室(实训项目)

    这里是我们实训的一个关于java聊天室的项目,有需要的同学可以看看,私聊功能未完善. 话不多说,直接上代码. 服务器: package ChatRoom;import java.awt.Color; ...

  5. Java聊天室的设计与实现

    Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端.本系统结构如下: (1)服务端: 1.能够开启和关闭服务器 2.等待着客户端从特殊端口发送的请求 3.监听的端口并不是固定的,服务 ...

  6. java聊天室论文,JAVA聊天室毕业论文

    JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...

  7. Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 )

    Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 文章目录 Java聊天室项目GUI界面化实现(Java聊天室 IO流 Socket流 GUI界面 ) 1.J ...

  8. java 聊天室之 传送图片文字等功能的实现

    前几日写的一篇简陋之极的java聊天室被各位前辈说是,一塌糊涂,乌烟瘴气,只是简单的实现了需要的功能,并未做到人性化.在下痛定思痛,心想还是先学会显示功能再做美化界面,美化代码的打算! 在奋斗了一天之 ...

  9. Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统 Java即时通讯 Java聊天系统

    Java聊天室程序源码 Java即时通讯代码 Java局域网聊天系统  Java即时通讯 Java聊天系统 public Swingtest002() {// 设置标题setTitle("请 ...

最新文章

  1. Iptables防火墙配置详解
  2. HttpClient 详解一《C#高级编程(第9版)》
  3. 从JVM的常见异常来看Tomcat中内存的设置
  4. 02-Django基础知识
  5. 说干就干的p2psearcher2013
  6. linux 添加网关 多张,linux – 更改默认网关,多个NIC
  7. hashmap containsvalue时间复杂度_Java-HashMap面试问答
  8. 精通RPM之--制作篇(rpmbuild)
  9. API的 Signature(签名)Token(令牌) 认证
  10. 数据结构上机实践第14周项目1(4) - 验证算法(平衡二叉树)
  11. 【资源】机器学习资源积累(积累中...)
  12. 2021-06-21层次选择器
  13. Python金融大数据风控建模实战
  14. 五子棋游戏设计(C语言AI智能板)
  15. 萤石摄像头实现抓拍短视频
  16. 163邮箱无法通过POP3接收邮件
  17. wireshark抓包分析怎么看进程_教大家wireshark抓包数据怎么看
  18. 浏览器播放视频时蓝牙耳机自动关机
  19. Livezilla安装配置, APE(Ajax Push Engine)安装配置
  20. Markdown离线编辑器

热门文章

  1. KITTI 数据集oxts 文件解析
  2. 2023北京智源大会亮点回顾 | 高性能计算、深度学习和大模型:打造通用人工智能AGI的金三角
  3. FFmpeg 推流后部分播放器无法播放
  4. 高频电路板罗杰斯RogersRO3003规格参数
  5. API_Day04_文本操作-IO流
  6. 计算机搜索没办法打汉字,Win10左下角搜索框无法输入字符的两种解决方法
  7. robotframework-Selenium2Library安装及爆红异常解决
  8. screentogif录屏有声音吗_电脑录屏,真的没那么麻烦
  9. 【财务危机】--2018.8债务
  10. 推荐一个基于 Vue 的低代码平台