您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎么在Java中使用Socket實現一個多人聊天室,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
流程
首先建立一個服務器端,構建ServerSocket并綁定端口
創建socket客戶端,連接到指定ip以及其端口
然后使用accept阻塞接收socket發出的連接請求
獲取連接后的socket客戶端的輸入流和輸出流
根據輸入流和輸出流進行兩者數據的通信
值得一提是:該Socket是同步阻塞的,因此在socket客戶端需要進行創建一個線程,來分別進行向服務器輸出,和接收服務器傳輸的數據。要解決同步阻塞這個問題可以去了解JAVA NIO。
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 { //創建連接指定Ip和端口的socket Socket socket = new Socket("127.0.0.1",5200); //獲取系統標準輸入流 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); PrintWriter out = new PrintWriter(socket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //創建一個線程用于讀取服務器的信息 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)){ //將從鍵盤獲取的信息給到服務器 out.println(line); out.flush(); //顯示輸入的信息 line = reader.readLine(); } out.close(); in.close(); socket.close(); } }
由于要接收多個客戶端的請求,因此服務端需要多個線程進行分別來接收客戶端的請求。
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 { //創建服務端 ServerSocket server = new ServerSocket(5200); boolean flag = true; //接受客戶端請求 while (flag){ try { //阻塞等待客戶端的連接 Socket accept = server.accept(); synchronized (sockets){ sockets.add(accept); } //多個服務器線程進行對客戶端的響應 Thread thread = new Thread(new ServerThead(accept)); thread.start(); //捕獲異常。 }catch (Exception e){ flag = false; e.printStackTrace(); } } //關閉服務器 server.close(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * 服務器線程,主要來處理多個客戶端的請求 */ 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())); //設置該客戶端的端點地址 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轉發消息 * @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(); } } } /** * 關閉該socket的連接 * @throws IOException */ public void closeConnect() throws IOException { System.out.println("Client@"+socketName+"已退出聊天"); print("Client@"+socketName+"已退出聊天"); //移除沒連接上的客戶端 synchronized (sockets){ sockets.remove(socket); } socket.close(); } }
由于要接收多個客戶端的信息,并轉發到每一個已經連接上的客戶端,因此創建了一個Vector集合來保存每一個客戶端Socket,由于是多個線程同時對這個Vector集合進行操作,因此加上synchronized關鍵字保證同步安全。
先運行服務器端,然后在運行多個客戶端就可以進行多人聊天了。
下面是運行的結果。
客戶端2
客戶端1
客戶端3
以上就是怎么在Java中使用Socket實現一個多人聊天室,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。