多人聊天室原理图

源码

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

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. centos删除系统自带的httpd
  2. aspx repeater 用法_ASP.NET - Repeater 控件
  3. 来自http://oldboy.blog.51cto.com/2561410/1308647 有趣的企业shell实战编程题:
  4. 905. 按奇偶排序数组
  5. asp.net mvc 地址栏传输信息报错:window.location.pathname
  6. 《数据结构题集》2.12
  7. VCC,GND,VSS,VDD的理解
  8. 如何管理网络营销渠道冲突?
  9. 工具武装的前端开发工程师
  10. x-code中蓝色文件夹和绿色文件夹的区别
  11. 软件开发搞定操作系统
  12. 手机用html电视,手机怎么连接电视
  13. 嵌入式成长轨迹33 【嵌入式学习阶段】【ARM环境调试】【在虚拟机下Ubuntu建立NFS网络文件系统】...
  14. 计算机类的毕业论文是怎么查重的,论文检测软件是如何实现查重功能的
  15. Handler execution resulted in exception: Content type 'application/json;charset=UTF-8' not supported
  16. VML编辑器代码实现(转载)
  17. Direct Boot Mode
  18. 程序包xxx不存在 问题的完美解决
  19. Cow Gymnastics//队列//排位1
  20. ERP学习网站,搜集中...

热门文章

  1. 函授计算机网络工程,通信工程函授本科《计算机网络》试卷(A)答案0519.doc
  2. JavaScript分类显示随机颜色【红绿蓝青黄紫、黑白、全彩】
  3. 自学PHP与参加PHP培训的区别到底有多大
  4. 索引的基本原理 索引设计的原则
  5. 《Linux性能优化实战》笔记(四)—— CPU 使用率
  6. Latex-1-计算机视觉-cheatsheet
  7. Android开发之输入法详解
  8. 信用卡逾期多少天会成为黑户?
  9. 安卓交流软件!写给程序员的Flutter详细教程,技术详细介绍
  10. 背包问题看这一篇就够了(详细版)