Java基于Socket實現(xiàn)多人聊天室
本文實例為大家分享了Java基于Socket實現(xiàn)簡易版多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下
一、 聊天室需求
1、一個服務(wù)端,多個客戶端;
2、實現(xiàn)客戶端和服務(wù)端的交互;
3、客戶端發(fā)送信息,服務(wù)端收到信息,再轉(zhuǎn)發(fā)給其他客戶端;
4、上下線時顯示哪個客戶端上下線并且顯示在線客戶端數(shù)量;
二、代碼分析
1. 建立連接
客戶端類,創(chuàng)建發(fā)送端Socket對象,用自己的IP地址和端口號,與服務(wù)端建立連接。
class Client:
//用于與服務(wù)端通信的Socket private Socket socket; public Client() throws Exception { ?? ?/* ?? ? * 初始化Socket的同時要制定服務(wù)端的IP地址和端口號 ?? ? * ip地址用于我們在網(wǎng)絡(luò)上找到服務(wù)端的所在計算在 ?? ? * 端口號用于找到服務(wù)器上的服務(wù)端應(yīng)用程序。 ?? ? *? ?? ? * 實例化Socket的過程就是連接服務(wù)端的過程若 ?? ? * 服務(wù)端無響應(yīng),這里得構(gòu)造方法得拋出異常。 ?? ? *? ?? ? */ ?? ?try { ?? ??? ?System.out.println("正在連接服務(wù)器......"); ?? ??? ?//localhost 127.0.0.1 ?? ??? ?socket = new Socket("LAPTOP-TCK59O6Q",8888); ?? ??? ?System.out.println("與服務(wù)端連接完畢"); ?? ?} catch (Exception e) { ?? ??? ?System.out.println("初始化失敗"); ?? ??? ?throw e; ?? ?} }?
服務(wù)端類,使用構(gòu)造方法初始化服務(wù)端,創(chuàng)建接收端的Socket對象
class Server:
private ServerSocket server; //構(gòu)造方法初始化服務(wù)端 public Server() throws IOException { ?? ?//實例化serverSocket的同時,指定服務(wù)端的端口號; ?? ?try { ?? ??? ?server = new ServerSocket(8888); ?? ??? ?allOut = new ArrayList<PrintWriter>(); ?? ?} catch (Exception e) { ?? ??? ?System.out.println("服務(wù)端初始化失敗"); ?? ??? ?throw e; ?? ?} }
2. 客戶端發(fā)送信息
在客戶端的類中寫一個start()方法,start()是客戶端發(fā)送信息給服務(wù)端的方法
獲取輸出流對象,把鍵盤錄入的信息發(fā)送到服務(wù)端。
class Client:
public void start() throws Exception { ?? ?/* ?? ? * 客戶端開始工作的方法 ?? ? */ ?? ?try { ?? ??? ?//啟動用于讀取服務(wù)端發(fā)送消息的線程 ?? ??? ?ServerHandler handler = new ServerHandler(); ?? ??? ?//ServerHandler是自己寫的類,實現(xiàn)Runnable接口,有多線程功能 ?? ??? ?Thread t = new Thread(handler); ?? ??? ?t.start(); ?? ??? ? ?? ??? ?//將數(shù)據(jù)發(fā)送到服務(wù)端 ?? ??? ?OutputStream out = socket.getOutputStream();//獲取輸出流對象 ?? ??? ?OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");//轉(zhuǎn)化成utf-8格式 ?? ??? ?PrintWriter pw = new PrintWriter(osw,true); ?? ??? ?Scanner scan = new Scanner(System.in); ?? ??? ?while(true) { ?? ??? ??? ?String message = scan.nextLine();//得到鍵盤錄入的信息 ?? ??? ??? ?pw.println(message);//把信息輸出到服務(wù)端 ?? ??? ?} ?? ??? ? ?? ?} catch (Exception e) { ?? ??? ?System.out.println("客戶端運(yùn)行失敗"); ?? ??? ?throw e; ?? ?}? ?? ? }
服務(wù)端工作的start()方法,accept()方法與客戶端連接上
class Server:
//服務(wù)端工作的方法 public void start() throws IOException { ?? ?/* ?? ? * ServerSocket提供了一個accept的方法,該方法是一個阻塞方法, ?? ? * 用于監(jiān)聽其打開的8888端口;當(dāng)一個客戶端通過該端口與服務(wù)端連接時, ?? ? * accept方法就會解除阻塞,然后創(chuàng)建一個socket實例并返回, ?? ? * socket的作用就是與剛剛連接上的客戶端進(jìn)行通信。 ?? ? */ ?? ?while(true) { ?? ??? ?System.out.println("等待客戶端連接..."); ?? ??? ?Socket socket = server.accept(); ?? ??? ?System.out.println("一個客戶端連接了!"); ?? ??? ?//啟動一個線程來處理客戶端的交互工作 ?? ??? ?ClientHandler hander = new ClientHandler(socket); ?? ??? ?Thread t = new Thread(hander); ?? ??? ?t.start(); ?? ?} }
3. 開啟多線程、服務(wù)端接收讀取信息并廣播
因為服務(wù)端與多個客戶端相連,所以要用多線程,即一個客戶端用一條線程。
在服務(wù)端類中創(chuàng)建一個內(nèi)部類ClientHandler實現(xiàn)Runnable接口并重寫run()方法創(chuàng)建線程
屬性有客戶端的Socket對象
有參構(gòu)造方法中通過客戶端的Socket獲取到其地址host,并且把地址打印出來
這樣在main()方法中,實例化服務(wù)端類的對象之后,start方法開啟服務(wù)端,當(dāng)有客戶端連接上時,就能輸出這個客戶端的ip地址。
ClientHandler類要重寫run()方法,使用輸入流InputStream讀取客戶端發(fā)來的信息,再使用輸出流OutputStream給所有客戶端廣播收到的信息、用戶上下線和在線人數(shù)
class Server:
/** ?* ClientHandler ?* 該線程類是與指定的客戶端進(jìn)行交互工作; ?* @author zxm ?* ?*/ class ClientHandler implements Runnable{ ?? ?//當(dāng)前線程客戶端的Socket ?? ?private Socket socket; ?? ? ?? ?//該客戶端的地址 ?? ?private String host; ?? ? ?? ?public ClientHandler(Socket socket) { ?? ??? ?this.socket=socket; ?? ??? ?/* ?? ??? ? * 通過socket獲取遠(yuǎn)程計算機(jī)地址 ?? ??? ? * 對于服務(wù)端而言,遠(yuǎn)程計算機(jī)就是客戶端 ?? ??? ? */ ?? ??? ?InetAddress address = socket.getInetAddress(); ?? ??? ? ?? ??? ?//獲取ip地址 ?? ??? ?host = address.getHostAddress(); ?? ??? ?System.out.println("host"+host); ?? ?} ?? ?@Override ?? ?public void run() { ?? ??? ?PrintWriter pw = null; ?? ??? ?try { ?? ??? ??? ?//廣播給所有客戶端,當(dāng)前用戶上線了 ?? ??? ??? ?sendMessage("["+host+"]上線了"); ?? ??? ??? ?OutputStream out = socket.getOutputStream(); ?? ??? ??? ?OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8"); ?? ??? ??? ?pw = new PrintWriter(osw,true); ?? ??? ??? ?//將該客戶的輸出流存入共享集合,以便消息可以廣播給該客戶端 ?? ??? ??? ?addOut(pw); ?? ??? ??? ? ?? ??? ??? ?//廣播當(dāng)前在線人數(shù) ?? ??? ??? ?sendMessage("當(dāng)前在線人數(shù)["+allOut.size()+"]"); ?? ??? ??? ? ?? ??? ??? ?//處理來自客戶端的數(shù)據(jù) ?? ??? ??? ?InputStream in = socket.getInputStream(); ?? ??? ??? ?InputStreamReader isr = new InputStreamReader(in,"utf-8"); ?? ??? ??? ?BufferedReader br = new BufferedReader(isr); ?? ??? ??? ?/* ?? ??? ??? ? * 服務(wù)端讀取客戶端發(fā)送過來的每一句字符時 ?? ??? ??? ? * 由于客戶端所在的操作系統(tǒng)不同,這里客戶端斷開時結(jié)果也不同 ?? ??? ??? ? * windows客戶端開始br.readLine拋出異常 ?? ??? ??? ? * Linux客戶端斷開是返回null ?? ??? ??? ? *? ?? ??? ??? ? */ ?? ??? ??? ?String message = null; ?? ??? ??? ?while((message = br.readLine())!=null) { ?? ??? ??? ??? ?sendMessage(host+"說:"+message); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ?} catch (Exception e) { ?? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ?e.printStackTrace(); ?? ??? ?}finally { ?? ??? ??? ?//將該客戶端的輸出流從共享集合中刪除 ?? ??? ??? ?removeOut(pw); ?? ??? ??? ? ?? ??? ??? ?//廣播給所有客戶端,當(dāng)前用戶下線 ?? ??? ??? ?sendMessage("["+host+"]下線了"); ?? ??? ??? ? ?? ??? ??? ?//廣播當(dāng)前在線人數(shù) ?? ??? ??? ?sendMessage("當(dāng)前在線人數(shù)["+allOut.size()+"]"); ?? ??? ??? ? ?? ??? ??? ?try { ?? ??? ??? ??? ?socket.close(); ?? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ?} ?? ?} }
因此服務(wù)端類中要寫一個sendMessage()方法,為了在接收到一個客戶端的信息后,把這個信息轉(zhuǎn)發(fā)給所有客戶端,這就是廣播的效果。
寫一個集合allOut,用來存放所有客戶端的輸出流,客戶端的數(shù)量就是集合里元素的個數(shù)
再寫兩個方法,一個是addOut()方法把上線客戶端的輸出流放進(jìn)集合(在run方法中使用addOut(),獲取到啟用新線程的客戶端的輸出流,把輸出流加到集合中),
另一個是removeOut()方法拿出集合(同理run()方法中使用,把socket關(guān)閉的客戶端的輸出流移除集合)。
所以sendMessage()方法的參數(shù)就是某個客戶端發(fā)的字符串信息message,遍歷allOut集合,把message在每個輸出流中打印,用PrintWrite類中的print方法。
當(dāng)客戶端連接服務(wù)端時,sendMessage()方法打印這個服務(wù)端的地址加上上線了,同理客戶端關(guān)閉socket的時候打印下線了,
同時上下線后再打印allOut集合的大小,也就是當(dāng)前連接服務(wù)端的客戶端數(shù)量,就是在線人數(shù)。
class Server:
//存放所有客戶端的輸出流的集合,用于廣播 private List<PrintWriter> allOut; //將給定的輸出流放入共享集合 private synchronized void addOut(PrintWriter out){ ?? ?allOut.add(out); } //將給定的輸出流移除共享集合 private synchronized void removeOut(PrintWriter out){ ?? ?allOut.remove(out); } //將給定的消息發(fā)給多個客戶端 private synchronized void sendMessage(String message) { ?? ? ?? ?for(PrintWriter out:allOut) { ?? ??? ?out.println(message); ?? ?} }
4. 客戶端讀取信息
這個時候所有的客戶端都收到了某個客戶發(fā)的消息,但是還沒讀,所以客戶端類中要加輸入流才能讀取,
創(chuàng)建ServerHandler類實現(xiàn)Runnable接口,輸入流讀取并輸出。
class Client:
class ServerHandler implements Runnable{ ?? ?/** ?? ? * 該線程用于讀取服務(wù)端發(fā)送過來的消息,并輸出到 ?? ? * 客戶端的控制臺上 ?? ? * @author zxm ?? ? * ?? ? */ ?? ?@Override ?? ?public void run() { ?? ??? ?try { ?? ??? ??? ?InputStream in = socket.getInputStream();//輸入流 ?? ??? ??? ?InputStreamReader isr = new InputStreamReader(in,"UTF-8");//以utf-8讀 ?? ??? ??? ?BufferedReader br = new BufferedReader(isr); ?? ??? ??? ?String message = null; ?? ??? ??? ?while((message=br.readLine())!=null) { ?? ??? ??? ??? ?System.out.println(message); ?? ??? ??? ?} ?? ??? ?} catch (Exception e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?}? ?? ?} }
三、完整代碼
1. 客戶端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; /** ?* 聊天室服務(wù)端 ?* @author zxm ?*/ public class Client { ?? ? ?? ?//用于與服務(wù)端通信的Socket ?? ?private Socket socket; ?? ? ?? ?public Client() throws Exception { ?? ??? ?/* ?? ??? ? * 初始化Socket的同時要制定服務(wù)端的IP地址和端口號 ?? ??? ? * ip地址用于我們在網(wǎng)絡(luò)上找到服務(wù)端的所在計算在 ?? ??? ? * 端口號用于找到服務(wù)器上的服務(wù)端應(yīng)用程序。 ?? ??? ? *? ?? ??? ? * *實例化Socket的過程就是連接服務(wù)端的過程若 ?? ??? ? * 服務(wù)端無響應(yīng),這里得構(gòu)造方法得拋出異常。 ?? ??? ? *? ?? ??? ? */ ?? ??? ?try { ?? ??? ??? ?System.out.println("正在連接服務(wù)器......"); ?? ??? ??? ?//localhost 127.0.0.1 ?? ??? ??? ?socket = new Socket("LAPTOP-TCK59O6Q",8888); ?? ??? ??? ?System.out.println("與服務(wù)端連接完畢"); ?? ??? ?} catch (Exception e) { ?? ??? ??? ?System.out.println("初始化失敗"); ?? ??? ??? ?throw e; ?? ??? ?} ?? ?} ?? ? ?? ?public void start() throws Exception { ?? ??? ?/* ?? ??? ? * 客戶端開始工作的方法 ?? ??? ? */ ?? ??? ?try { ?? ??? ??? ?//啟動用于讀取服務(wù)端發(fā)送消息的線程 ?? ??? ??? ?ServerHandler handler = new ServerHandler(); ?? ??? ??? ?//ServerHandler是自己寫的類,實現(xiàn)Runnable接口,有多線程功能 ?? ??? ??? ?Thread t = new Thread(handler); ?? ??? ??? ?t.start(); ?? ??? ??? ? ?? ??? ??? ?//將數(shù)據(jù)發(fā)送到服務(wù)端 ?? ??? ??? ?OutputStream out = socket.getOutputStream();//獲取輸出流對象 ?? ??? ??? ?OutputStreamWriter osw = new OutputStreamWriter(out,"utf-8");//轉(zhuǎn)化成utf-8格式 ?? ??? ??? ?PrintWriter pw = new PrintWriter(osw,true); ?? ??? ??? ?Scanner scan = new Scanner(System.in); ?? ??? ??? ?while(true) { ?? ??? ??? ??? ?String message = scan.nextLine();//得到鍵盤錄入的信息 ?? ??? ??? ??? ?pw.println(message);//把信息輸出到服務(wù)端 ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ?} catch (Exception e) { ?? ??? ??? ?System.out.println("客戶端運(yùn)行失敗"); ?? ??? ??? ?throw e; ?? ??? ?}? ?? ??? ? ?? ?} ?? ?public static void main(String[] args) throws Exception { ?? ??? ? ?? ??? ?try { ?? ??? ??? ?Client client = new Client(); ?? ??? ??? ?client.start(); ?? ??? ?} catch (Exception e) { ?? ??? ??? ?System.out.println("客戶端運(yùn)行失敗"); ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ? ?? ?} ?? ? ?? ?class ServerHandler implements Runnable{ ?? ??? ?/** ?? ??? ? * 該線程用于讀取服務(wù)端發(fā)送過來的消息,并輸出到 ?? ??? ? * 客戶端的控制臺上 ?? ??? ? * @author zxm ?? ??? ? * ?? ??? ? */ ?? ??? ?@Override ?? ??? ?public void run() { ?? ??? ??? ?try { ?? ??? ??? ??? ?InputStream in = socket.getInputStream();//輸入流 ?? ??? ??? ??? ?InputStreamReader isr = new InputStreamReader(in,"UTF-8");//以utf-8讀 ?? ??? ??? ??? ?BufferedReader br = new BufferedReader(isr); ?? ??? ??? ??? ?String message = null; ?? ??? ??? ??? ?while((message=br.readLine())!=null) { ?? ??? ??? ??? ??? ?System.out.println(message); ?? ??? ??? ??? ?} ?? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?}? ?? ??? ?} ?? ?} ?? ? }
2. 服務(wù)端
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; /** ?* 聊天室服務(wù)端 ?* @author zxm? ?*/ public class Server { ?? ?/* ?? ? * 運(yùn)行在服務(wù)端的socket ?? ? * 該類的作用是: ?? ? * ?? ?1.申請服務(wù)端口,客戶端就是通過它申請的服務(wù)端口連接上服務(wù)端應(yīng)用的。 ?? ? * ?2.監(jiān)聽申請的服務(wù)端口感知客戶端的連接,并創(chuàng)建一個socket與該客戶通信。 ?? ? */ ?? ?private ServerSocket server; ?? ? ?? ?//存放所有客戶端的輸出流的集合,用于廣播 ?? ?private List<PrintWriter> allOut; ?? ? ?? ?//將給定的輸出流放入共享集合 ?? ?private synchronized void addOut(PrintWriter out){ ?? ??? ?allOut.add(out); ?? ?} ?? ? ?? ?//將給定的輸出流移除共享集合 ?? ?private synchronized void removeOut(PrintWriter out){ ?? ??? ?allOut.remove(out); ?? ?} ?? ? ?? ?//將給定的消息發(fā)給多個客戶端 ?? ?private synchronized void sendMessage(String message) { ?? ??? ? ?? ??? ?for(PrintWriter out:allOut) { ?? ??? ??? ?out.println(message); ?? ??? ?} ?? ?} ?? ? ?? ?//構(gòu)造方法初始化服務(wù)端 ?? ?public Server() throws IOException { ?? ??? ?//實例化serverSocket的同時,指定服務(wù)端的端口號; ?? ??? ?try { ?? ??? ??? ?server = new ServerSocket(8888); ?? ??? ??? ?allOut = new ArrayList<PrintWriter>(); ?? ??? ?} catch (Exception e) { ?? ??? ??? ?System.out.println("服務(wù)端初始化失敗"); ?? ??? ??? ?throw e; ?? ??? ?} ?? ?} ?? ? ?? ?//服務(wù)端工作的方法 ?? ?public void start() throws IOException { ?? ??? ?/* ?? ??? ? * ServerSocket提供了一個accept的方法,該方法是一個阻塞方法, ?? ??? ? * 用于監(jiān)聽其打開的8888端口;當(dāng)一個客戶端通過該端口與服務(wù)端連接時, ?? ??? ? * accept方法就會解除阻塞,然后創(chuàng)建一個socket實例并返回, ?? ??? ? * socket的作用就是與剛剛連接上的客戶端進(jìn)行通信。 ?? ??? ? */ ?? ??? ?while(true) { ?? ??? ??? ?System.out.println("等待客戶端連接..."); ?? ??? ??? ?Socket socket = server.accept(); ?? ??? ??? ?System.out.println("一個客戶端連接了!"); ?? ??? ??? ?//啟動一個線程來處理客戶端的交互工作 ?? ??? ??? ?ClientHandler hander = new ClientHandler(socket); ?? ??? ??? ?Thread t = new Thread(hander); ?? ??? ??? ?t.start(); ?? ??? ?} ?? ?} ?? ? ?? ? ?? ?public static void main(String[] args) throws Exception { ?? ??? ?Server server = new Server(); ?? ??? ?server.start(); ?? ?} ?? ? ?? ?/** ?? ? * 該線程類是與指定的客戶端進(jìn)行交互工作; ?? ? * @author zxm ?? ? * ?? ? */ ?? ?class ClientHandler implements Runnable{ ?? ??? ?//當(dāng)前線程客戶端的Socket ?? ??? ?private Socket socket; ?? ??? ? ?? ??? ?//該客戶端的地址 ?? ??? ?private String host; ?? ??? ? ?? ??? ?public ClientHandler(Socket socket) { ?? ??? ??? ?this.socket=socket; ?? ??? ??? ?/* ?? ??? ??? ? * 通過socket獲取遠(yuǎn)程計算機(jī)地址 ?? ??? ??? ? * 對于服務(wù)端而言,遠(yuǎn)程計算機(jī)就是客戶端 ?? ??? ??? ? */ ?? ??? ??? ?InetAddress address = socket.getInetAddress(); ?? ??? ??? ? ?? ??? ??? ?//獲取ip地址 ?? ??? ??? ?host = address.getHostAddress(); ?? ??? ??? ?System.out.println("host"+host); ?? ??? ?} ?? ??? ?@Override ?? ??? ?public void run() { ?? ??? ??? ?PrintWriter pw = null; ?? ??? ??? ?try { ?? ??? ??? ??? ?//廣播給所有客戶端,當(dāng)前用戶上線了 ?? ??? ??? ??? ?sendMessage("["+host+"]上線了"); ?? ??? ??? ??? ?OutputStream out = socket.getOutputStream(); ?? ??? ??? ??? ?OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8"); ?? ??? ??? ??? ?pw = new PrintWriter(osw,true); ?? ??? ??? ??? ?//將該客戶的輸出流存入共享集合,以便消息可以廣播給該客戶端 ?? ??? ??? ??? ?addOut(pw); ?? ??? ??? ??? ? ?? ??? ??? ??? ?//廣播當(dāng)前在線人數(shù) ?? ??? ??? ??? ?sendMessage("當(dāng)前在線人數(shù)["+allOut.size()+"]"); ?? ??? ??? ??? ? ?? ??? ??? ??? ?//處理來自客戶端的數(shù)據(jù) ?? ??? ??? ??? ?InputStream in = socket.getInputStream(); ?? ??? ??? ??? ?InputStreamReader isr = new InputStreamReader(in,"utf-8"); ?? ??? ??? ??? ?BufferedReader br = new BufferedReader(isr); ?? ??? ??? ??? ?/* ?? ??? ??? ??? ? * 服務(wù)端讀取客戶端發(fā)送過來的每一句字符時 ?? ??? ??? ??? ? * 由于客戶端所在的操作系統(tǒng)不同,這里客戶端斷開時結(jié)果也不同 ?? ??? ??? ??? ? * windows客戶端開始br.readLine拋出異常 ?? ??? ??? ??? ? * Linux客戶端斷開是返回null ?? ??? ??? ??? ? *? ?? ??? ??? ??? ? */ ?? ??? ??? ??? ?String message = null; ?? ??? ??? ??? ?while((message = br.readLine())!=null) { ?? ??? ??? ??? ??? ?sendMessage(host+"說:"+message); ?? ??? ??? ??? ?} ?? ??? ??? ??? ? ?? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?}finally { ?? ??? ??? ??? ?//將該客戶端的輸出流從共享集合中刪除 ?? ??? ??? ??? ?removeOut(pw); ?? ??? ??? ??? ? ?? ??? ??? ??? ?//廣播給所有客戶端,當(dāng)前用戶下線 ?? ??? ??? ??? ?sendMessage("["+host+"]下線了"); ?? ??? ??? ??? ? ?? ??? ??? ??? ?//廣播當(dāng)前在線人數(shù) ?? ??? ??? ??? ?sendMessage("當(dāng)前在線人數(shù)["+allOut.size()+"]"); ?? ??? ??? ??? ? ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?socket.close(); ?? ??? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ??? ?// TODO Auto-generated catch block ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ?} ?? ?} ?? ? }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Java和WebSocket實現(xiàn)網(wǎng)頁聊天室實例代碼
- java socket實現(xiàn)聊天室 java實現(xiàn)多人聊天功能
- Java基于socket實現(xiàn)簡易聊天室實例
- java實現(xiàn)一個簡單TCPSocket聊天室功能分享
- Java Socket聊天室編程(一)之利用socket實現(xiàn)聊天之消息推送
- Java Socket聊天室編程(二)之利用socket實現(xiàn)單聊聊天室
- 用java WebSocket做一個聊天室
- 基于Tomcat7、Java、WebSocket的服務(wù)器推送聊天室實例
- Java編程實現(xiàn)基于TCP協(xié)議的Socket聊天室示例
- java利用Socket實現(xiàn)聊天室功能實例
相關(guān)文章
通過FeignClient如何獲取文件流steam?is?close問題
這篇文章主要介紹了通過FeignClient如何獲取文件流steam?is?close問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06HttpServletResponse亂碼問題_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了HttpServletResponse亂碼問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題
這篇文章主要介紹了idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01深入學(xué)習(xí)java位運(yùn)算的基礎(chǔ)知識
位運(yùn)算是直接對整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作嗎,位運(yùn)算即可以節(jié)約內(nèi)存,同時使程序速度更快效率更高。文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,下面我們來一起學(xué)習(xí)下吧2019-06-06Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn)
本文主要介紹了Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09