您好,登錄后才能下訂單哦!
本文實(shí)例為大家分享了java基于C/S結(jié)構(gòu)實(shí)現(xiàn)多線程聊天室的具體代碼,供大家參考,具體內(nèi)容如下
主要實(shí)現(xiàn)的功能:
服務(wù)器端建立ServerSocket阻塞監(jiān)聽來自客戶端的Socket連接,并為之開辟一個(gè)新的線程
讀取來自該連接的數(shù)據(jù),廣播每一個(gè)客戶端數(shù)據(jù),這里簡單地使用一個(gè)鏈表保存所有來自客戶端的所有Socket連接
客戶端連接上服務(wù)器端后主要有兩個(gè)線程在工作:
主線程:不斷獲取鍵盤的輸入并寫入該Socket中傳輸給服務(wù)器
副線程:不斷從服務(wù)器Socket流中讀取傳來的數(shù)據(jù),打印到屏幕上。
服務(wù)器端代碼:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.ServerSocket; import java.util.ArrayList; import javax.swing.JOptionPane; public class MyServer { public static ArrayList<Socket> socketlist = new ArrayList<Socket>(); private static String port ; public static void main(String[] args) throws IOException { //彈出一個(gè)對(duì)話框輸入端口號(hào) port = JOptionPane.showInputDialog("input the port number: "); int ServerPort = new Integer(port).intValue(); ServerSocket ss = new ServerSocket(ServerPort); System.out.println("Server is initializating..."); while(true) { System.out.println("Server is waiting..."); //此處將阻塞監(jiān)聽 Socket s = ss.accept(); System.out.println("listening from: " + s.getInetAddress()); socketlist.add(s); new Thread(new ServerThread(s)).start(); } } } class ServerThread implements Runnable { Socket s = null; BufferedReader br = null; public ServerThread(Socket s) throws IOException { this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run() { try { String content = null; while( (content = readFromClient()) != null ) { //播報(bào)每個(gè)客戶端數(shù)據(jù) for(Socket s : MyServer.socketlist) { PrintStream ps = new PrintStream(s.getOutputStream()); ps.println(content); } } } catch (IOException io) { io.printStackTrace(); } } private String readFromClient() { try { return br.readLine(); } catch (IOException io) { MyServer.socketlist.remove(s); System.out.println(s.getInetAddress() + " is disconnecting..."); } return null; } }
客戶端代碼:
import java.net.Socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; public class MyClient { public static void main(String[] args) throws Exception { Socket s = new Socket("192.168.1.164", 30000); // new Thread to read content from server. new Thread(new ClientThread(s)).start(); PrintStream ps = new PrintStream(s.getOutputStream()); String line = null; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while((line = br.readLine()) != null) { ps.println(line); } } } class ClientThread implements Runnable { private Socket s = null; BufferedReader br = null; public ClientThread(Socket s) throws IOException { this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run() { try { String content = null; while( (content = br.readLine()) != null) { System.out.println(content); } } catch (IOException io) { io.printStackTrace(); } } }
后期開發(fā):
上面程序功能很簡單,沒有記錄客戶信息,考慮添加功能如下:(多人聊天室)
客戶端發(fā)來的信息必須添加特殊標(biāo)識(shí),用于區(qū)別 登陸,私聊,公聊 三種,如果是登陸,則服務(wù)器端應(yīng)該有一個(gè)Map來保存用戶名和對(duì)應(yīng)輸出流中間的關(guān)系,用來處理用戶名重復(fù)的情況,還有如果是私聊,必須知道從客戶端發(fā)來消息的用戶名和將要發(fā)給哪一個(gè)用戶的特殊標(biāo)識(shí),考慮在輸入字符串里加入特殊標(biāo)識(shí)符。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。