Java之ServerSocket使用及說明
前言

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

1.實現TCP
要使用ServerSocket實現TCP連接,可以按照以下步驟進行操作:
- 創(chuàng)建ServerSocket對象,并指定要監(jiān)聽的端口號。
ServerSocket serverSocket = new ServerSocket(port);
- 調用accept()方法監(jiān)聽并接受客戶端的連接請求。accept()方法會阻塞程序直到有客戶端連接成功,并返回與客戶端建立連接后的Socket對象。
Socket socket = serverSocket.accept();
- 使用返回的Socket對象與客戶端進行數據交互。可以使用InputStream和OutputStream來接收和發(fā)送數據。
// 從客戶端讀取數據
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String clientMessage = dataInputStream.readUTF();
// 向客戶端發(fā)送數據
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("Hello Client!");
- 使用完畢后,調用close()方法關閉ServerSocket以及與之關聯(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對象
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started and listening on port " + port);
// 監(jiān)聽并接受客戶端的連接請求
Socket socket = serverSocket.accept();
System.out.println("Client connected: " + socket.getInetAddress().getHostAddress());
// 從客戶端讀取數據
InputStream inputStream = socket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
String clientMessage = dataInputStream.readUTF();
System.out.println("Received message from client: " + clientMessage);
// 向客戶端發(fā)送數據
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF("Hello Client!");
// 關閉連接
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
這個示例代碼創(chuàng)建了一個簡單的TCP服務器,監(jiān)聽在端口1234上。當有客戶端連接成功后,服務器會從客戶端接收一條消息,并向客戶端發(fā)送一條回復消息。完成后,服務器關閉連接。
要測試該示例代碼,可以編寫一個TCP客戶端,使用相同的端口號連接到服務器,發(fā)送消息并接收回復。
2.實現UDP
要使用ServerSocket實現UDP連接,可以按照以下步驟操作:
- 創(chuàng)建DatagramSocket對象,并指定要監(jiān)聽的端口號。
DatagramSocket serverSocket = new DatagramSocket(port);
- 創(chuàng)建一個字節(jié)數組用于接收數據。
byte[] receiveData = new byte[1024];
- 創(chuàng)建一個DatagramPacket對象,用于接收從客戶端發(fā)送過來的數據。
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
- 使用receive()方法從客戶端接收數據。該方法會阻塞程序直到接收到數據。
serverSocket.receive(receivePacket);
- 使用DatagramPacket對象獲取接收到的數據,并進行相應處理。
String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
- 可以使用DatagramPacket對象獲取客戶端的IP地址和端口號。
InetAddress clientIPAddress = receivePacket.getAddress(); int clientPort = receivePacket.getPort();
- 可以使用DatagramSocket對象向客戶端發(fā)送數據。首先創(chuàng)建一個字節(jié)數組和一個DatagramPacket對象。
String serverMessage = "Hello Client!"; byte[] sendData = serverMessage.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIPAddress, clientPort);
- 使用send()方法將數據發(fā)送給客戶端。
serverSocket.send(sendPacket);
- 使用完畢后,調用close()方法關閉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對象
DatagramSocket serverSocket = new DatagramSocket(port);
System.out.println("Server started and listening on port " + port);
// 創(chuàng)建一個字節(jié)數組用于接收數據
byte[] receiveData = new byte[1024];
// 創(chuàng)建一個DatagramPacket對象,用于接收數據
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
// 接收從客戶端發(fā)送的數據
serverSocket.receive(receivePacket);
// 獲取接收到的數據和客戶端的信息
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ā)送數據
String serverMessage = "Hello Client!";
byte[] sendData = serverMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientIPAddress, clientPort);
serverSocket.send(sendPacket);
// 關閉連接
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
這個示例代碼創(chuàng)建了一個簡單的UDP服務器,監(jiān)聽在端口1234上。當有客戶端發(fā)送數據時,服務器會接收并打印出來,然后向客戶端發(fā)送一條回復消息。完成后,服務器關閉連接。
要測試該示例代碼,可以編寫一個UDP客戶端,使用相同的端口號連接到服務器,發(fā)送數據并接收回復。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringData JPA審計功能(@CreatedDate與@LastModifiedDate)實現
Spring Data JPA的審計功能提供了一種強大而靈活的機制,用于自動跟蹤實體的創(chuàng)建和修改信息,通過使用@CreatedDate和@LastModifiedDate注解,開發(fā)者可以輕松地實現時間審計,感興趣的可以了解一下2025-04-04
SpringAop @Aspect織入不生效,不執(zhí)行前置增強織入@Before方式
這篇文章主要介紹了SpringAop @Aspect織入不生效,不執(zhí)行前置增強織入@Before方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
SpringBoot整合Sa-Token實現登錄認證的示例代碼
本文主要介紹了SpringBoot整合Sa-Token實現登錄認證的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

