本篇文章給大家分享的是有關怎么在Java中使用Socket實現一個多人聊天室,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
流程
首先建立一個服務器端,構建ServerSocket并綁定端口
創建socket客戶端,連接到指定ip以及其端口
然后使用accept阻塞接收socket發出的連接請求
獲取連接后的socket客戶端的輸入流和輸出流
根據輸入流和輸出流進行兩者數據的通信
值得一提是:該Socket是同步阻塞的,因此在socket客戶端需要進行創建一個線程,來分別進行向服務器輸出,和接收服務器傳輸的數據。要解決同步阻塞這個問題可以去了解JAVA NIO。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client{
public static void main(String[] args) throws IOException {
//創建連接指定Ip和端口的socket
Socket socket = new Socket("127.0.0.1",5200);
//獲取系統標準輸入流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//創建一個線程用于讀取服務器的信息
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true){
System.out.println(in.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//寫信息給客戶端
String line = reader.readLine();
while (!"end".equalsIgnoreCase(line)){
//將從鍵盤獲取的信息給到服務器
out.println(line);
out.flush();
//顯示輸入的信息
line = reader.readLine();
}
out.close();
in.close();
socket.close();
}
}由于要接收多個客戶端的請求,因此服務端需要多個線程進行分別來接收客戶端的請求。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.Vector;
public class Servers {
//將接收到的socket變成一個集合
protected static List<Socket> sockets = new Vector<>();
public static void main(String[] args) throws IOException {
//創建服務端
ServerSocket server = new ServerSocket(5200);
boolean flag = true;
//接受客戶端請求
while (flag){
try {
//阻塞等待客戶端的連接
Socket accept = server.accept();
synchronized (sockets){
sockets.add(accept);
}
//多個服務器線程進行對客戶端的響應
Thread thread = new Thread(new ServerThead(accept));
thread.start();
//捕獲異常。
}catch (Exception e){
flag = false;
e.printStackTrace();
}
}
//關閉服務器
server.close();
}
}import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 服務器線程,主要來處理多個客戶端的請求
*/
public class ServerThead extends Servers implements Runnable{
Socket socket;
String socketName;
public ServerThead(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//設置該客戶端的端點地址
socketName = socket.getRemoteSocketAddress().toString();
System.out.println("Client@"+socketName+"已加入聊天");
print("Client@"+socketName+"已加入聊天");
boolean flag = true;
while (flag)
{
//阻塞,等待該客戶端的輸出流
String line = reader.readLine();
//若客戶端退出,則退出連接。
if (line == null){
flag = false;
continue;
}
String msg = "Client@"+socketName+":"+line;
System.out.println(msg);
//向在線客戶端輸出信息
print(msg);
}
closeConnect();
} catch (IOException e) {
try {
closeConnect();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
/**
* 向所有在線客戶端socket轉發消息
* @param msg
* @throws IOException
*/
private void print(String msg) throws IOException {
PrintWriter out = null;
synchronized (sockets){
for (Socket sc : sockets){
out = new PrintWriter(sc.getOutputStream());
out.println(msg);
out.flush();
}
}
}
/**
* 關閉該socket的連接
* @throws IOException
*/
public void closeConnect() throws IOException {
System.out.println("Client@"+socketName+"已退出聊天");
print("Client@"+socketName+"已退出聊天");
//移除沒連接上的客戶端
synchronized (sockets){
sockets.remove(socket);
}
socket.close();
}
}由于要接收多個客戶端的信息,并轉發到每一個已經連接上的客戶端,因此創建了一個Vector集合來保存每一個客戶端Socket,由于是多個線程同時對這個Vector集合進行操作,因此加上synchronized關鍵字保證同步安全。
先運行服務器端,然后在運行多個客戶端就可以進行多人聊天了。
下面是運行的結果。
客戶端2
客戶端1
客戶端3

以上就是怎么在Java中使用Socket實現一個多人聊天室,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。