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)文章
關(guān)于Mybatis動(dòng)態(tài)sql中test的坑點(diǎn)總結(jié)
這篇文章主要介紹了關(guān)于Mybatis動(dòng)態(tài)sql中test的坑點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
redisson 實(shí)現(xiàn)分布式鎖的源碼解析
這篇文章主要介紹了redisson 實(shí)現(xiàn)分布式鎖的源碼解析,通過模擬一個(gè)商品秒殺的場(chǎng)景結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
java 制作驗(yàn)證碼并進(jìn)行驗(yàn)證實(shí)例詳解
這篇文章主要介紹了java 制作驗(yàn)證碼并進(jìn)行驗(yàn)證實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
使用Postman傳遞arraylist數(shù)據(jù)給springboot方式
這篇文章主要介紹了使用Postman傳遞arraylist數(shù)據(jù)給springboot方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
mybatis主表與明細(xì)表一對(duì)多的同時(shí)插入操作方法
對(duì)主表(采購(gòu)申請(qǐng)表)和明細(xì)表(申請(qǐng)物資表)同時(shí)進(jìn)行插入操作insert,怎么實(shí)現(xiàn)呢,下面給大家分享mybatis主表與明細(xì)表一對(duì)多的同時(shí)插入操作方法,感興趣的朋友一起看看吧2023-02-02
SpringBoot在idea中的 .idea和 .iml文件的作用
本文主要介紹了SpringBoot在idea中的 .idea和 .iml文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
面試官:詳細(xì)談?wù)凧ava對(duì)象的4種引用方式
這篇文章主要給大家介紹了java面試官常會(huì)問到的,關(guān)于Java對(duì)象的4種引用方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
springboot多模塊多環(huán)境配置文件問題(動(dòng)態(tài)配置生產(chǎn)和開發(fā)環(huán)境)
這篇文章主要介紹了springboot多模塊多環(huán)境配置文件問題(動(dòng)態(tài)配置生產(chǎn)和開發(fā)環(huán)境),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04

