新西兰服务器

java怎么实现群聊功能


java怎么实现群聊功能

发布时间:2022-05-19 16:46:19 来源:高防服务器网 阅读:50 作者:iii 栏目:开发技术

这篇文章主要介绍“java怎么实现群聊功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java怎么实现群聊功能”文章能帮助大家解决问题。

1、服务端

package networkCoding;     import java.io.DataInputStream;  import java.io.DataOutputStream;  import java.io.IOException;  import java.net.ServerSocket;  import java.net.Socket;  import java.util.concurrent.CopyOnWriteArrayList;     /**   *    * 1, 指定端口,使用serverSocket创建服务器   * 2, 阻塞式等待连接accept   * 3, 操作:输入输出流操作   * 4, 释放资源   *    * 5,加入容器实现群聊   *    * **/     public class WeiHuShanChatRoomServer {      private static CopyOnWriteArrayList<Chat> all= new CopyOnWriteArrayList<Chat>();         public static void main(String[] args) throws IOException {          System.out.println("-----server");           // 1, 指定端口,使用serverSocket创建服务器          ServerSocket server= new ServerSocket(9999);           // 2, 阻塞式等待连接accept          while(true) {          Socket client=server.accept();          Chat chat= new Chat(client);          // 交给容器管理          all.add(chat);          new Thread(chat) .start();          }      }      static class Chat implements Runnable{          private DataOutputStream dos;          private DataInputStream dis;          private Socket client;          private boolean isRuning;          private String name;          public Chat(Socket client) {              this.client=client;              this.isRuning=true;              try {                  this.dis = new DataInputStream(client.getInputStream());                  this.dos=new DataOutputStream(client.getOutputStream());                  this.name=receive();                  this.send(this.name+",威虎山欢迎你的到来");                  this.sendOthers(this.name+"来到了威虎山",true);              } catch (IOException e) {                  // 出错释放资源                  System.out.println("===1==");                  this.release();                            }          }          private String receive() {              String data="";              try {                  data= dis.readUTF();              } catch (IOException e) {                  System.out.println("===2==");                  //this.release();                                }              return data;          }          // 群聊          private void send(String data) {              try {                  dos.writeUTF(data);                  dos.flush();              } catch (IOException e) {                  System.out.println("===3==");                  this.release();                                }          }          private void sendOthers(String data,boolean isSys) {              boolean isPrivate = data.startsWith("@");               if(isPrivate) {                  int index= data.indexOf(":");                  String targetName=data.substring(1,index);                  String msg=data.substring(index+1);                  for (Chat chat : all) {                      if(chat.name.equals(targetName)) {                          System.out.println("******"+chat.name+targetName);                          chat.send(this.name+"悄悄对你说:"+msg);                      }                  }                                }else {                  for (Chat chat : all) {                      if(chat==this) {                          continue;                      }else {                          if(isSys) {                              chat.send(data);                          }else {                              chat.send(this.name+"对大家说:"+data);                          }                      }                                        }              }                        }          private void release() {              this.isRuning=false;              Utils.close(dis,dos,client);              all.remove(this);              sendOthers(this.name+"离开了威虎山", true);          }          @Override          public void run() {              while(isRuning) {                  String data = receive();                  if(!data.equals("")) {                       sendOthers(data,false);                  }else {                      send("不能发送空消息");                  }                                }                        }      }     }

2、客户端

package networkCoding;     import java.io.BufferedOutputStream;  import java.io.BufferedReader;  import java.io.DataInputStream;  import java.io.DataOutputStream;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.Socket;  import java.net.UnknownHostException;     /**   *    * 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;   * 2, 操作:输入输出流操作   * 3, 释放资源   *    * **/     public class WeiHuShanChatRoomClient {         public static void main(String[] args) throws UnknownHostException, IOException {          BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));          System.out.println("请输入姓名");          String bfString = bf.readLine();          //1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;          Socket client = new Socket("localhost",9999);          // 2, 操作:输入输出流操作          new Thread(new Send(client,bfString)).start();          new Thread(new Receive(client)).start();                }           }

(1)发送封装类

package networkCoding;     import java.io.BufferedReader;  import java.io.DataInputStream;  import java.io.DataOutputStream;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.Socket;     public class Send implements  Runnable{      private BufferedReader bf;      private DataOutputStream dos;      private Socket client;      private boolean isRuning;      private String name;      public Send(Socket client,String name) {          this.client=client;          this.isRuning=true;          this.name=name;          this.bf= new BufferedReader(new InputStreamReader(System.in));          try {              this.dos=new DataOutputStream(client.getOutputStream());              this.send(name);          } catch (IOException e) {              // 出错释放资源              System.out.println("===4==");              this.release();              this.isRuning=false;          }      }      private void release() {          this.isRuning=false;          Utils.close(dos,client);      }      private void send(String data) {          try {              dos.writeUTF(data);              dos.flush();          } catch (IOException e) {              System.out.println("===5==");              this.release();                        }      }      private String getString() {          String dataString ="";          try {              dataString = this.bf.readLine();          } catch (IOException e) {              System.out.println("===6==");              this.release();          }          return dataString;      }            @Override      public void run() {          // TODO Auto-generated method stub          while(isRuning) {              String data = getString();              if(!data.equals("")) {                  send(data);              }else {                  //send("不能发送空消息");              }                        }      }     }

(2)接收封装类

package networkCoding;     import java.io.BufferedReader;  import java.io.DataInputStream;  import java.io.DataOutputStream;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.Socket;     public class Receive implements Runnable {      private DataInputStream dis;      private Socket client;      private boolean isRuning;      public Receive(Socket client) {          this.client=client;          this.isRuning=true;          try {              this.dis = new DataInputStream(client.getInputStream());          } catch (IOException e) {              // 出错释放资源              System.out.println("===6==");              this.release();              this.isRuning=false;          }      }      private String receive() {          String data="";          try {              data= dis.readUTF();          } catch (IOException e) {              System.out.println("===7==");              this.release();          }          return data;      }      private void release() {          this.isRuning=false;          Utils.close(dis,client);      }      @Override      public void run() {          while(isRuning) {              String data = receive();              if(!data.equals("")) {                  System.out.println(data);              }else {                                }                        }                }              }

3、工具类

package networkCoding;     import java.io.Closeable;  import java.io.IOException;     public class Utils {      public static void main(String[] args) {                }      public static void close(Closeable...target) {          for (Closeable obj : target) {              try {                  if(null!=obj) {                      obj.close();                  }              } catch (IOException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();              }          }      }  }

关于“java怎么实现群聊功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注高防服务器网行业资讯频道,小编每天都会为大家更新不同的知识点。

[微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

[图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
[