java基于C/S結(jié)構(gòu)實現(xiàn)多線程聊天室
本文實例為大家分享了java基于C/S結(jié)構(gòu)實現(xiàn)多線程聊天室的具體代碼,供大家參考,具體內(nèi)容如下
主要實現(xiàn)的功能:
服務(wù)器端建立ServerSocket阻塞監(jiān)聽來自客戶端的Socket連接,并為之開辟一個新的線程
讀取來自該連接的數(shù)據(jù),廣播每一個客戶端數(shù)據(jù),這里簡單地使用一個鏈表保存所有來自客戶端的所有Socket連接
客戶端連接上服務(wù)器端后主要有兩個線程在工作:
主線程:不斷獲取鍵盤的輸入并寫入該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 { //彈出一個對話框輸入端口號 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 ) { //播報每個客戶端數(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)識,用于區(qū)別 登陸,私聊,公聊 三種,如果是登陸,則服務(wù)器端應(yīng)該有一個Map來保存用戶名和對應(yīng)輸出流中間的關(guān)系,用來處理用戶名重復(fù)的情況,還有如果是私聊,必須知道從客戶端發(fā)來消息的用戶名和將要發(fā)給哪一個用戶的特殊標(biāo)識,考慮在輸入字符串里加入特殊標(biāo)識符。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決
這篇文章主要介紹了關(guān)于spring 掃描不到j(luò)ar中class文件的原因分析及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08淺談JAVA字符串匹配算法indexOf函數(shù)的實現(xiàn)方法
這篇文章主要介紹了淺談字符串匹配算法indexOf函數(shù)的實現(xiàn)方法,indexOf函數(shù)我們可以查找一個字符串(模式串)是否在另一個字符串(主串)出現(xiàn)過。對此感興趣的可以來了解一下2020-07-07Spring中DAO被循環(huán)調(diào)用的時候數(shù)據(jù)不實時更新的解決方法
這篇文章主要介紹了Spring中DAO被循環(huán)調(diào)用的時候數(shù)據(jù)不實時更新的解決方法,需要的朋友可以參考下2014-08-08JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺為例)
這篇文章主要介紹了JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺為例),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01