Java多人聊天室 Java实现多人聊天室

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java多人聊天室 Java实现多人聊天室

程序员小汪   2021-04-07 我要评论
想了解Java实现多人聊天室的相关内容吗,程序员小汪在本文为您仔细讲解Java多人聊天室的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:java多人聊天室,java多人聊天,java聊天室,下面大家一起来学习吧。

多人聊天室原理图

源码

工具类:

该类用于关闭各种流。

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);
 }
 }

 @Override
 public 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();
 }

 }

 @Override
 public 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;
 }
 @Override
 public 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();
 }
}

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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们