Java之ServerSocket使用及說明
前言

Java中的ServerSocket是一種用于建立服務(wù)器端socket的類。它允許程序在指定端口上監(jiān)聽客戶端的連接請(qǐng)求,并在連接成功后與客戶端進(jìn)行數(shù)據(jù)交互。
ServerSocket類提供了一些方法,用于控制服務(wù)器端socket的行為,如綁定端口、監(jiān)聽連接請(qǐng)求、接受連接、關(guān)閉連接等。
常用方法
以下是ServerSocket類的一些常用方法:
- ServerSocket(int port): 構(gòu)造器,用于創(chuàng)建一個(gè)指定端口的ServerSocket對(duì)象。
- void bind(SocketAddress endpoint):將ServerSocket綁定到指定的端口,可以是本地或遠(yuǎn)程端口。
- Socket accept():監(jiān)聽并接受客戶端的連接請(qǐng)求,返回一個(gè)與客戶端建立連接后的Socket對(duì)象。
- void close():關(guān)閉ServerSocket以及與之關(guān)聯(lián)的所有Socket連接。
使用
ServerSocket的使用步驟如下:
- 創(chuàng)建ServerSocket對(duì)象,并指定監(jiān)聽的端口。
- 調(diào)用bind()方法將ServerSocket綁定到指定端口。
- 調(diào)用accept()方法監(jiān)聽并接受客戶端的連接請(qǐng)求。
- 使用返回的Socket對(duì)象與客戶端進(jìn)行數(shù)據(jù)交互。
- 使用完畢后,調(diào)用close()方法關(guān)閉ServerSocket以及與之關(guān)聯(lián)的所有Socket連接。
ServerSocket的常見應(yīng)用場(chǎng)景包括:建立Web服務(wù)器、FTP服務(wù)器、郵件服務(wù)器等需要監(jiān)聽客戶端連接請(qǐng)求的網(wǎng)絡(luò)服務(wù)。
案例

1.實(shí)現(xiàn)TCP
要使用ServerSocket實(shí)現(xiàn)TCP連接,可以按照以下步驟進(jìn)行操作:
- 創(chuàng)建ServerSocket對(duì)象,并指定要監(jiān)聽的端口號(hào)。
ServerSocket serverSocket = new ServerSocket(port);
- 調(diào)用accept()方法監(jiān)聽并接受客戶端的連接請(qǐng)求。accept()方法會(huì)阻塞程序直到有客戶端連接成功,并返回與客戶端建立連接后的Socket對(duì)象。
Socket socket = serverSocket.accept();
- 使用返回的Socket對(duì)象與客戶端進(jìn)行數(shù)據(jù)交互??梢允褂肐nputStream和OutputStream來接收和發(fā)送數(shù)據(jù)。
// 從客戶端讀取數(shù)據(jù)
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String clientMessage = dataInputStream.readUTF();
// 向客戶端發(fā)送數(shù)據(jù)
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("Hello Client!");
- 使用完畢后,調(diào)用close()方法關(guān)閉ServerSocket以及與之關(guān)聯(lián)的所有Socket連接。
serverSocket.close();
完整的示例代碼如下:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
int port = 1234;
try {
// 創(chuàng)建ServerSocket對(duì)象
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started and listening on port " + port);
// 監(jiān)聽并接受客戶端的連接請(qǐng)求
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());
// 從客戶端讀取數(shù)據(jù)
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String clientMessage = dataInputStream.readUTF();
System.out.println("Received message from client: " + clientMessage);
// 向客戶端發(fā)送數(shù)據(jù)
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("Hello Client!");
// 關(guān)閉連接
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
這個(gè)示例代碼創(chuàng)建了一個(gè)簡(jiǎn)單的TCP服務(wù)器,監(jiān)聽在端口1234上。當(dāng)有客戶端連接成功后,服務(wù)器會(huì)從客戶端接收一條消息,并向客戶端發(fā)送一條回復(fù)消息。完成后,服務(wù)器關(guān)閉連接。
要測(cè)試該示例代碼,可以編寫一個(gè)TCP客戶端,使用相同的端口號(hào)連接到服務(wù)器,發(fā)送消息并接收回復(fù)。
2.實(shí)現(xiàn)UDP
要使用ServerSocket實(shí)現(xiàn)UDP連接,可以按照以下步驟操作:
- 創(chuàng)建DatagramSocket對(duì)象,并指定要監(jiān)聽的端口號(hào)。
DatagramSocket serverSocket = new DatagramSocket(port);
- 創(chuàng)建一個(gè)字節(jié)數(shù)組用于接收數(shù)據(jù)。
byte[] receiveData = new byte[1024];
- 創(chuàng)建一個(gè)DatagramPacket對(duì)象,用于接收從客戶端發(fā)送過來的數(shù)據(jù)。
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
- 使用receive()方法從客戶端接收數(shù)據(jù)。該方法會(huì)阻塞程序直到接收到數(shù)據(jù)。
serverSocket.receive(receivePacket);
- 使用DatagramPacket對(duì)象獲取接收到的數(shù)據(jù),并進(jìn)行相應(yīng)處理。
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
- 可以使用DatagramPacket對(duì)象獲取客戶端的IP地址和端口號(hào)。
InetAddress clientIPAddress = receivePacket.getAddress(); int clientPort = receivePacket.getPort();
- 可以使用DatagramSocket對(duì)象向客戶端發(fā)送數(shù)據(jù)。首先創(chuàng)建一個(gè)字節(jié)數(shù)組和一個(gè)DatagramPacket對(duì)象。
String serverMessage = "Hello Client!"; byte[] sendData = serverMessage.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIPAddress, clientPort);
- 使用send()方法將數(shù)據(jù)發(fā)送給客戶端。
serverSocket.send(sendPacket);
- 使用完畢后,調(diào)用close()方法關(guān)閉DatagramSocket。
serverSocket.close();
完整的示例代碼如下:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String[] args) {
int port = 1234;
try {
// 創(chuàng)建DatagramSocket對(duì)象
DatagramSocket serverSocket = new DatagramSocket(port);
System.out.println("Server started and listening on port " + port);
// 創(chuàng)建一個(gè)字節(jié)數(shù)組用于接收數(shù)據(jù)
byte[] receiveData = new byte[1024];
// 創(chuàng)建一個(gè)DatagramPacket對(duì)象,用于接收數(shù)據(jù)
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
// 接收從客戶端發(fā)送的數(shù)據(jù)
serverSocket.receive(receivePacket);
// 獲取接收到的數(shù)據(jù)和客戶端的信息
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
InetAddress clientIPAddress = receivePacket.getAddress();
int clientPort = receivePacket.getPort();
System.out.println("Received message from client: " + clientMessage);
// 向客戶端發(fā)送數(shù)據(jù)
String serverMessage = "Hello Client!";
byte[] sendData = serverMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIPAddress, clientPort);
serverSocket.send(sendPacket);
// 關(guān)閉連接
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
這個(gè)示例代碼創(chuàng)建了一個(gè)簡(jiǎn)單的UDP服務(wù)器,監(jiān)聽在端口1234上。當(dāng)有客戶端發(fā)送數(shù)據(jù)時(shí),服務(wù)器會(huì)接收并打印出來,然后向客戶端發(fā)送一條回復(fù)消息。完成后,服務(wù)器關(guān)閉連接。
要測(cè)試該示例代碼,可以編寫一個(gè)UDP客戶端,使用相同的端口號(hào)連接到服務(wù)器,發(fā)送數(shù)據(jù)并接收回復(fù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringData JPA審計(jì)功能(@CreatedDate與@LastModifiedDate)實(shí)現(xiàn)
Spring Data JPA的審計(jì)功能提供了一種強(qiáng)大而靈活的機(jī)制,用于自動(dòng)跟蹤實(shí)體的創(chuàng)建和修改信息,通過使用@CreatedDate和@LastModifiedDate注解,開發(fā)者可以輕松地實(shí)現(xiàn)時(shí)間審計(jì),感興趣的可以了解一下2025-04-04
SpringAop @Aspect織入不生效,不執(zhí)行前置增強(qiáng)織入@Before方式
這篇文章主要介紹了SpringAop @Aspect織入不生效,不執(zhí)行前置增強(qiáng)織入@Before方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼
本文主要介紹了SpringBoot整合Sa-Token實(shí)現(xiàn)登錄認(rèn)證的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
SpringBoot統(tǒng)一數(shù)據(jù)返回的方法實(shí)現(xiàn)
在前后端交互過程中,為了便于數(shù)據(jù)處理,后端數(shù)據(jù)需要進(jìn)行統(tǒng)一封裝返回給前端,這種做法不僅方便前后端溝通,降低了溝通成本,還有助于項(xiàng)目的統(tǒng)一維護(hù)和后端技術(shù)部門的規(guī)范制定,本文就來介紹一下2024-10-10
Java面試題沖刺第二十六天--實(shí)戰(zhàn)編程
這篇文章主要為大家分享了最有價(jià)值的三道java實(shí)戰(zhàn)面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-08-08
詳解Java線程池隊(duì)列中的延遲隊(duì)列DelayQueue
這篇文章主要為大家詳細(xì)介紹了Java線程池隊(duì)列中的延遲隊(duì)列DelayQueue的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12

