多人聊天室原理图

源码

工具类:
该类用于关闭各种流。

public class CloseUtil {public static void CloseAll(Closeable... closeable){for(Closeable c:closeable){if (c != null) {try {c.close();} catch (IOException e) {e.printStackTrace();}}}}
}

服务器:
服务器端创建一个serverSocket对象通过accept()方法监听是否有tcp连接,同时有一个储存socket对象的集合将连接进来的对象储存到List集合中,服务器将消息进行转发。

//服务器
public class Server {//存储每一个连接进来的客户端public static List<MyChannel> list=new ArrayList<>();public static void main(String[] args) throws Exception {//创建ServerSocket对象ServerSocket serverSocket = new ServerSocket(9999);while (true){//连接进来的客户端Socket client = serverSocket.accept();System.out.println(client.getInetAddress()+"进入聊天室");MyChannel myChannel = new MyChannel(client);list.add(myChannel);new Thread(myChannel).start();}}
}

消息转发类:
具体的消息转发实现类,将信息发给除发送消息以外的其他客户端。

//用于信息转发
public class MyChannel implements Runnable{private DataInputStream dis;private DataOutputStream dos;private boolean flag=true;public MyChannel(Socket socket) {try{dis=new DataInputStream(socket.getInputStream());dos=new DataOutputStream(socket.getOutputStream());}catch (IOException e){flag=false;CloseUtil.CloseAll(dis,dos);}}//接收数据的方法private String receive(){String str="";try{str= dis.readUTF();}catch (IOException e){flag=false;CloseUtil.CloseAll(dis,dos);Server.list.remove(this);}return str;}//发送数据的方法private void send(String str){try {if (str != null && str.length() != 0) {dos.writeUTF(str);dos.flush();}}catch (Exception exception){flag=false;CloseUtil.CloseAll(dos,dis);Server.list.remove(this);}}//转发消息的方法private void sendToOther(){String str=this.receive();List<MyChannel> list = Server.list;for (MyChannel other:list) {if(other==list){continue;//不发送信息给自己}//将消息发送给其他客户端other.send(str);}}@Overridepublic void run() {while (flag){sendToOther();}}
}

发送信息类:
用于从键盘上获取数据然后将数据发送出去

public class Send implements Runnable{//从键盘上获取数据private BufferedReader br;private DataOutputStream dos;private boolean flag=true;public Send() {br=new BufferedReader(new InputStreamReader(System.in));}public Send(Socket socket){this();try{dos=new DataOutputStream(socket.getOutputStream());}catch (Exception e){flag=false;CloseUtil.CloseAll(dos,socket);e.printStackTrace();}}private String getMessage(){String str="";try{str=br.readLine();}catch (IOException e){flag=false;CloseUtil.CloseAll(br);}return str;}private void send(String str){try {dos.writeUTF(str);dos.flush();} catch (IOException e) {flag=false;CloseUtil.CloseAll(dos);e.printStackTrace();}}@Overridepublic void run() {while (flag){this.send(getMessage());}}
}

信息接收类:

public class Receive implements Runnable{//接受数据流private DataInputStream dis;private boolean flag=true;public Receive(Socket socket){try {dis = new DataInputStream(socket.getInputStream());}catch (Exception e){flag=false;CloseUtil.CloseAll(dis,socket);}}private String getMessage(){String str="";try {str=dis.readUTF();} catch (IOException e) {flag=false;CloseUtil.CloseAll(dis);e.printStackTrace();}return str;}@Overridepublic void run() {while (flag){System.out.println(this.getMessage());}}
}

客户端:

public class client {public static void main(String[] args) throws Exception{Socket socket = new Socket(InetAddress.getLocalHost(),9999);Send send = new Send(socket);Receive receive = new Receive(socket);new Thread(send).start();new Thread(receive).start();}
}

先将服务器启动然后启动客户端:测试结果如下


有喜欢的小伙伴可以自己拿去玩,代码复制直接有效。

Java实现多人聊天室相关推荐

  1. java实现多人聊天室+私聊+Derby数据库

    java实现多人聊天室+私聊+Derby数据库(没有实现注册功能) 这个聊天室困扰了我好久好久,一步一步的修改,终于不负我的努力啊,可算完成了,对于一个初学java的来说,完成第一个比较完整的项目,也 ...

  2. java socket多人聊天室_如何运用Java socket实现多人聊天室功能

    如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...

  3. java tcp多人聊天室

    TCP的多人聊天室 上次写了一个只能两个人通信的TCP,这次写了个可以多人聊天的,利用多线程实现. 设计模式: 服务端:首先运行服务器,然后启动一个专门处理客户端消息的线程,然后监听是否有客户端连接, ...

  4. Java BIO多人聊天室

    基于上篇NIO的多人聊天室,这篇将用BIO也实现一遍 首先是服务端的设计: /*** @author Jing* @create 2020/5/17*/ public class ChatServer ...

  5. java swing多人聊天室_使用java swing和socket编程实现简单的多人聊天室-Go语言中文社区...

    完成效果如下 客户端: 服务器端: 客户端功能: 输入服务器对应的端口,IP号,用户名(昵称),可以互相发送消息 服务器端功能: 输入端口号,启动,可以向所有客户端发送消息,IP地址自动获取. 下面是 ...

  6. java 多人聊天_java编程实现多人聊天室功能

    导读热词 本文实例为大家分享了java实现多人聊天室的具体代码,供大家参考,具体内容如下 程序源代码及运行截图: server.java //server.java package Socket; i ...

  7. Java TCP简易多人聊天室

    一.说明: ​ 本例是一个简易的Java TCP多人聊天室,先启动服务器端,再启动客户端,客户端敲入用户名,然后可以开始聊天,敲入信息,每一个在线的用户都会收到相应信息. 演示如下图: 二.服务器端代 ...

  8. java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)

    目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络编程 6.基于TCP的多线程的聊天室的实现 1.ISO和TCP/IP分层模 ...

  9. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

最新文章

  1. java软件网络工程师面试题_170道Java工程师面试题,你敢挑战吗?
  2. 【学亮IT手记】oracle远程连接工具PL/SQL Developer的安装使用教程
  3. WPF整理-处理没有注意到的异常
  4. 【数据库原理及应用】经典题库附答案(14章全)——第三章:结构化查询语言SQL
  5. linux shell之pushd、popd、dirs
  6. 微服务go还是java,Java微服务 vs Go微服务,究竟谁更强!?
  7. Android开发笔记(三十三)文本文件和图片文件的读写
  8. 给程序员的几条建议,精彩配图
  9. 介绍codesmith工具
  10. 目标检测面试问题非极大值抑制
  11. RGBA转换成RGB
  12. ANSYS网格划分标准及方法
  13. Chloe Orm的使用(一)
  14. 微信小程序进度条组件自定义数字_微信小程序小技巧系列《十三》多级联动,自定义圆形进度条 ... ......
  15. Power and Modulo(思维)
  16. 中关村科金李超:多元融合成为音视频技术发展新风向
  17. flash 小游戏大全
  18. 蓝桥杯练习题六 - 大数乘法(c++)
  19. 1.怎么样使一个 div 居中于浏览器中间
  20. 跨链桥之ZetaChain跨链测试网交互

热门文章

  1. 字节流java_Java基础教程——字节流
  2. Java swing设置jar包开机启动
  3. 快递单号查询,筛选暂存件单号归类为已签收
  4. BUUCTF:[MRCTF2020]摇滚DJ
  5. uwsgi django nginx多站点 pyvenv virutalvenv python 3 django 2这些限制下,如何让uwsgi跑起来?...
  6. Office_00000
  7. 借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流
  8. TCP连接的建立与断开
  9. Springboot商业项目-单体项目开发流程
  10. ApacheDS无法启动,导致Knox无法登陆,用户名和密码都是正确的。