欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java基于Socket實現(xiàn)多人聊天室

 更新時間:2022年09月02日 11:44:58   作者:becatjd  
這篇文章主要為大家詳細(xì)介紹了Java基于Socket實現(xiàn)多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)解析.xlsb文件的示例代碼

    Java實現(xiàn)解析.xlsb文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)解析.xlsb文件的相關(guān)方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2023-01-01
  • Java 由淺入深帶你掌握圖的遍歷

    Java 由淺入深帶你掌握圖的遍歷

    圖的遍歷是指,從給定圖中任意指定的頂點(稱為初始點)出發(fā),按照某種搜索方法沿著圖的邊訪問圖中的所有頂點,使每個頂點僅被訪問一次,這個過程稱為圖的遍歷。遍歷過程中得到的頂點序列稱為圖遍歷序列
    2022-03-03
  • 通過FeignClient如何獲取文件流steam?is?close問題

    通過FeignClient如何獲取文件流steam?is?close問題

    這篇文章主要介紹了通過FeignClient如何獲取文件流steam?is?close問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • HttpServletResponse亂碼問題_動力節(jié)點Java學(xué)院整理

    HttpServletResponse亂碼問題_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了HttpServletResponse亂碼問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 深入理解Java注解的使用方法

    深入理解Java注解的使用方法

    這篇文章主要為大家詳細(xì)介紹了Java注解的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • SWT(JFace) 打印功能

    SWT(JFace) 打印功能

    SWT(JFace)體驗之打印功能
    2009-06-06
  • DolphinScheduler容錯Master源碼分析

    DolphinScheduler容錯Master源碼分析

    這篇文章主要為大家介紹了DolphinScheduler容錯Master源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • idea創(chuàng)建spring boot項目及java版本只能選擇17和21的問題

    idea創(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ǔ)知識

    深入學(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-06
  • Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn)

    Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn)

    本文主要介紹了Java基于websocket協(xié)議與netty實時視頻彈幕交互實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論