最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java通過Socket實現(xiàn)簡單多人聊天室

 更新時間:2021年04月07日 14:05:48   作者:haki  
這篇文章主要為大家詳細介紹了Java通過Socket實現(xiàn)簡單多人聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java通過Socket實現(xiàn)多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下

Socket可以實現(xiàn)網(wǎng)絡(luò)上兩個程序通過雙向通道進行數(shù)據(jù)的交換,此外它是Java中網(wǎng)絡(luò)TCP/IP協(xié)議的封裝,例如可以進行網(wǎng)絡(luò)通信等等,下面我們就來簡單寫一下多人聊天室。

首先來分析一下要實現(xiàn)的流程

  • 首先建立一個服務(wù)器端,構(gòu)建ServerSocket并綁定端口
  • 創(chuàng)建socket客戶端,連接到指定ip以及其端口
  • 然后使用accept阻塞接收socket發(fā)出的連接請求
  • 獲取連接后的socket客戶端的輸入流和輸出流
  • 根據(jù)輸入流和輸出流進行兩者數(shù)據(jù)的通信

值得一提是:該Socket是同步阻塞的,因此在socket客戶端需要進行創(chuàng)建一個線程,來分別進行向服務(wù)器輸出,和接收服務(wù)器傳輸?shù)臄?shù)據(jù)。要解決同步阻塞這個問題可以去了解JAVA NIO。

Socket客戶端代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
public class Client{
 
 public static void main(String[] args) throws IOException {
 //創(chuàng)建連接指定Ip和端口的socket
 Socket socket = new Socket("127.0.0.1",5200);
 //獲取系統(tǒng)標準輸入流
 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 PrintWriter out = new PrintWriter(socket.getOutputStream());
 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
 //創(chuàng)建一個線程用于讀取服務(wù)器的信息
 new Thread(new Runnable() {
  @Override
  public void run() {
  try {
   while (true){
   System.out.println(in.readLine());
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
  }
 }).start();
 //寫信息給客戶端
 String line = reader.readLine();
 while (!"end".equalsIgnoreCase(line)){
  //將從鍵盤獲取的信息給到服務(wù)器
  out.println(line);
  out.flush();
  //顯示輸入的信息
  line = reader.readLine();
 }
 out.close();
 in.close();
 socket.close();
 
 }
}

由于要接收多個客戶端的請求,因此服務(wù)端需要多個線程進行分別來接收客戶端的請求。

Socket服務(wù)端代碼如下:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.Vector;
 
public class Servers {
 //將接收到的socket變成一個集合
 protected static List<Socket> sockets = new Vector<>();
 
 public static void main(String[] args) throws IOException {
 //創(chuàng)建服務(wù)端
 ServerSocket server = new ServerSocket(5200);
 boolean flag = true;
 //接受客戶端請求
 while (flag){
  try {
  //阻塞等待客戶端的連接
  Socket accept = server.accept();
  synchronized (sockets){
  sockets.add(accept);
  }
  //多個服務(wù)器線程進行對客戶端的響應(yīng)
  Thread thread = new Thread(new ServerThead(accept));
  thread.start();
  //捕獲異常。
  }catch (Exception e){
  flag = false;
  e.printStackTrace();
  }
 }
 //關(guān)閉服務(wù)器
 server.close();
 }
 
}

Server線程代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
 
/**
 * 服務(wù)器線程,主要來處理多個客戶端的請求
 */
public class ServerThead extends Servers implements Runnable{
 
 Socket socket;
 String socketName;
 
 public ServerThead(Socket socket){
 this.socket = socket;
 }
 @Override
 public void run() {
 try {
  BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  //設(shè)置該客戶端的端點地址
  socketName = socket.getRemoteSocketAddress().toString();
  System.out.println("Client@"+socketName+"已加入聊天");
  print("Client@"+socketName+"已加入聊天");
  boolean flag = true;
  while (flag)
  {
  //阻塞,等待該客戶端的輸出流
  String line = reader.readLine();
  //若客戶端退出,則退出連接。
  if (line == null){
   flag = false;
   continue;
  }
  String msg = "Client@"+socketName+":"+line;
  System.out.println(msg);
  //向在線客戶端輸出信息
  print(msg);
  }
 
  closeConnect();
 } catch (IOException e) {
  try {
  closeConnect();
  } catch (IOException e1) {
  e1.printStackTrace();
  }
 }
 }
 /**
 * 向所有在線客戶端socket轉(zhuǎn)發(fā)消息
 * @param msg
 * @throws IOException
 */
 private void print(String msg) throws IOException {
 PrintWriter out = null;
 synchronized (sockets){
 for (Socket sc : sockets){
  out = new PrintWriter(sc.getOutputStream());
  out.println(msg);
  out.flush();
 }
 }
 }
 /**
 * 關(guān)閉該socket的連接
 * @throws IOException
 */
 public void closeConnect() throws IOException {
 System.out.println("Client@"+socketName+"已退出聊天");
 print("Client@"+socketName+"已退出聊天");
 //移除沒連接上的客戶端
 synchronized (sockets){
  sockets.remove(socket);
 }
 socket.close();
 }
}

由于要接收多個客戶端的信息,并轉(zhuǎn)發(fā)到每一個已經(jīng)連接上的客戶端,因此創(chuàng)建了一個Vector集合來保存每一個客戶端Socket,由于是多個線程同時對這個Vector集合進行操作,因此加上synchronized關(guān)鍵字保證同步安全。

先運行服務(wù)器端,然后在運行多個客戶端就可以進行多人聊天了。

下面是運行的結(jié)果。

 

客戶端2

 

客戶端1

 

客戶端3

服務(wù)端

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • idea 創(chuàng)建properties配置文件的步驟

    idea 創(chuàng)建properties配置文件的步驟

    這篇文章主要介紹了idea 創(chuàng)建properties配置文件的步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • JavaGUI使用標簽與按鈕方法詳解

    JavaGUI使用標簽與按鈕方法詳解

    這篇文章主要介紹了JavaGUI使用標簽與按鈕方法,前段時間學了GUI,總體上概念還是有點模糊,于是決定花點時間簡單整理下。先簡單介紹一下GUI,GUI就是圖形用戶界面
    2023-03-03
  • Spring事務(wù)失效的各種場景(13種)

    Spring事務(wù)失效的各種場景(13種)

    本文主要介紹了Spring事務(wù)失效的各種場景,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 關(guān)于Spring框架中異常處理情況淺析

    關(guān)于Spring框架中異常處理情況淺析

    最近學習Spring時,認識到Spring異常處理的強大,這篇文章主要給大家介紹了關(guān)于Spring框架中異常處理情況的相關(guān)資料,通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • SpringBoot導出Excel表格到指定路徑的代碼詳解

    SpringBoot導出Excel表格到指定路徑的代碼詳解

    Spring Boot導出Excel通常涉及到使用第三方庫如Apache POI或者XlsxWriter等,它們能幫助你在Spring應(yīng)用中生成并下載Excel文件,那么SpringBoot如何導出Excel表格到指定路徑,本文將給大家詳細的介紹一下
    2024-07-07
  • Java常見基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

    Java常見基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了Java常見數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對廣大的程序愛好者有所幫助,同時祝大家有一個好成績,需要的朋友可以參考下,希望可以幫助到你
    2021-07-07
  • java自定義JDBC實現(xiàn)連接池

    java自定義JDBC實現(xiàn)連接池

    本文主要介紹了java自定義JDBC實現(xiàn)連接池,包含實現(xiàn)JDBC連接池以及SQLException?異常的處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-02-02
  • Mybatis使用IN語句查詢的實現(xiàn)

    Mybatis使用IN語句查詢的實現(xiàn)

    這篇文章主要介紹了Mybatis使用IN語句查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • mybatisplus的公共字段插入的實現(xiàn)

    mybatisplus的公共字段插入的實現(xiàn)

    這篇文章主要介紹了mybatisplus的公共字段插入,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 基于SpringBoot集成測試遠程連接Redis服務(wù)的教程詳解

    基于SpringBoot集成測試遠程連接Redis服務(wù)的教程詳解

    這篇文章主要介紹了基于SpringBoot集成測試遠程連接的Redis服務(wù)的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03

最新評論

托克逊县| 长顺县| 金秀| 普格县| 江口县| 平江县| 德兴市| 开原市| 葵青区| 阆中市| 宁海县| 个旧市| 义乌市| 内江市| 崇文区| 南安市| 喜德县| 会泽县| 临城县| 昭平县| 海晏县| 陵川县| 昔阳县| 鸡泽县| 邳州市| 枞阳县| 瑞金市| 资兴市| 文昌市| 新兴县| 新宁县| 两当县| 北川| 城步| 宽甸| 轮台县| 大化| 广州市| 郯城县| 汾西县| 白沙|