成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何用Java實現(xiàn)多人聊天室

這篇文章主要講解了“如何用Java實現(xiàn)多人聊天室”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何用Java實現(xiàn)多人聊天室”吧!

創(chuàng)新互聯(lián)成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站建設、成都做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元汕頭做網(wǎng)站,已為上家服務,為汕頭各地企業(yè)和個人服務,聯(lián)系電話:18982081108

多人聊天室原理圖

如何用Java實現(xiàn)多人聊天室

源碼

工具類:

該類用于關閉各種流。

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

服務器

服務器端創(chuàng)建一個serverSocket對象通過accept()方法監(jiān)聽是否有tcp連接,同時有一個儲存socket對象的集合將連接進來的對象儲存到List集合中,服務器將消息進行轉發(fā)。

//服務器
public class Server {
 //存儲每一個連接進來的客戶端
 public static List<MyChannel> list=new ArrayList<>();

 public static void main(String[] args) throws Exception {
   //創(chuàng)建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();
  }
 }
}

消息轉發(fā)類:

具體的消息轉發(fā)實現(xiàn)類,將信息發(fā)給除發(fā)送消息以外的其他客戶端。

//用于信息轉發(fā)
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);
  }
 }
 //接收數(shù)據(jù)的方法
 private String receive(){
  String str="";
  try{
   str= dis.readUTF();
  }catch (IOException e){
   flag=false;
   CloseUtil.CloseAll(dis,dos);
   Server.list.remove(this);
  }
  return str;
 }
 //發(fā)送數(shù)據(jù)的方法
 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);
  }
 }
 //轉發(fā)消息的方法
 private void sendToOther(){
  String str=this.receive();
  List<MyChannel> list = Server.list;
  for (MyChannel other:list) {
   if(other==list){
    continue;//不發(fā)送信息給自己
   }
   //將消息發(fā)送給其他客戶端
   other.send(str);
  }
 }

 @Override
 public void run() {
  while (flag){
   sendToOther();
  }
 }
}

發(fā)送信息類:用于從鍵盤上獲取數(shù)據(jù)然后將數(shù)據(jù)發(fā)送出去

public class Send implements Runnable{
 //從鍵盤上獲取數(shù)據(jù)
 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{
  //接受數(shù)據(jù)流
  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();
  }
}

先將服務器啟動然后啟動客戶端:測試結果如下 如何用Java實現(xiàn)多人聊天室 有喜歡的小伙伴可以自己拿去玩,代碼復制直接有效。

感謝各位的閱讀,以上就是“如何用Java實現(xiàn)多人聊天室”的內容了,經(jīng)過本文的學習后,相信大家對如何用Java實現(xiàn)多人聊天室這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

網(wǎng)頁名稱:如何用Java實現(xiàn)多人聊天室
文章地址:http://jinyejixie.com/article16/gpeigg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、ChatGPT、品牌網(wǎng)站建設網(wǎng)站改版、網(wǎng)站營銷、關鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

外貿網(wǎng)站制作
绥化市| 西峡县| 揭阳市| 平江县| 晋宁县| 安泽县| 梅州市| 阿克| 浮梁县| 恩施市| 全州县| 井陉县| 康平县| 磐安县| 康平县| 六盘水市| 杨浦区| 古交市| 大方县| 余江县| 准格尔旗| 噶尔县| 湘阴县| 新乐市| 青阳县| 眉山市| 北宁市| 宜都市| 易门县| 石林| 偏关县| 本溪市| 仪征市| 安义县| 岳阳县| 项城市| 东兰县| 嘉善县| 澜沧| 大理市| 中方县|