java實現多客戶聊天功能
java 實現多客戶端聊天(TCP),供大傢參考,具體內容如下
1. 編程思想:
1)、要想實現多客戶端聊天,首先需要有多個客戶端,而這些客戶端需要隨時發送消息和接受消息,所以收發消息需要放入不同的線程中。
2)、多客戶聊天並不是多個客戶之間進行兩兩通信,而是需要所有客戶端與服務端進行交互,再由服務端統一下發信息到其他參與聊天的客戶端。
2. 代碼實現:
2.1 實現專用於接收消息的子線程ReceiveThread
將接收消息和發送消息分為兩個線程,其中將發送消息寫入主線程中,開啟新的線程用於接收消息。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class ReceiveThread extends Thread{ private Socket socket; //私有的成員變量,套接字 public ReceiveThread(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader br = null;//使用帶緩沖區的字符輸入流接收信息 try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { e.printStackTrace(); } while(true){ try { System.out.println(br.readLine()); } catch (IOException e) { e.printStackTrace(); } } } }
2.2 客戶端代碼
import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Client { @SuppressWarnings("all") public static void main(String[] args) throws UnknownHostException, IOException { //ip:需要連接的服務端所在的ip //端口:客戶端連接的端口必須和服務端端口一致 Socket socket = new Socket("192.168.*.*",8080); Scanner scan = new Scanner(System.in); new ReceiveThread(socket).start(); //發送給服務端信息 while(true ){ PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("一號:"+scan.next()); } } }
註:
1)、客戶端代碼可以在局域網下的多臺電腦上運行,隻需要將ip地址改為服務端的ip,就能夠連接。
2)、如果想要使用同臺電腦完成一個服務端和兩個客戶端運行,進行測試多人聊天,可創建客戶端2,使用本機ip
Socket socket = new Socket("127.0.0.1",8080); Scanner scan = new Scanner(System.in); new ReceiveThread(socket).start(); //發送給服務端信息 while(true ){ PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("二號:"+scan.next()); }
2.3 服務端接收和轉發信息的線程ServerThread
服務端在每一個客戶端進行連接時,都會產生一個線程,用於服務這個客戶,負責接收該客戶發送的信息,並轉發到參與多人聊天的其他客戶。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.util.Map.Entry; import java.util.Set; public class ServerThread extends Thread{ private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader br = null; String str=null; try { br = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (IOException e) { e.printStackTrace(); } while(true){ try { str=br.readLine(); //在服務端輸出,可以監測到所有人的聊天信息。 System.out.println(str); //發送到其他客戶端 Set<Entry<InetAddress, Socket>> entrySet = Server.map.entrySet(); for (Entry<InetAddress, Socket> entry : entrySet) { InetAddress key = entry.getKey(); Socket value = entry.getValue(); if(socket.getInetAddress()!=key){ PrintStream printStream = new PrintStream(value.getOutputStream()); printStream.println(str); } } } catch (IOException e) { e.printStackTrace(); } } } }
2.4 服務端代碼
import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ConcurrentHashMap; public class Server { @SuppressWarnings("all") public static ConcurrentHashMap<InetAddress, Socket> map =new ConcurrentHashMap<>(); public static void main(String[] args) throws IOException, InterruptedException { //創建服務端的ServerSocket ServerSocket server = new ServerSocket(8080); while(true){ //接收到客戶連接就創建一個對應的套接字 Socket socket = server.accept(); //獲取該客戶的ip InetAddress inetAddress = socket.getInetAddress(); //將該客戶的ip和套接字裝入map集合 map.put(inetAddress, socket); //創建新的線程服務該客戶 new ServerThread(socket).start(); } } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。