在本文中,我們來學(xué)習(xí)下如何找到連接到服務(wù)器的客戶端計算機(jī)的IP地址。我們將創(chuàng)建一個簡單的客戶端-服務(wù)器場景,讓我們探索用于TCP/IP通信的java.net
API。
背景
Java應(yīng)用程序使用套接字在互聯(lián)網(wǎng)上進(jìn)行通信和發(fā)送數(shù)據(jù)。Java為客戶端應(yīng)用程序提供了java.net.Socket
類。
java.net.ServerSocket
類用于TCP/IP的服務(wù)器端套接字實(shí)現(xiàn)。我們平時只關(guān)注TCP/IP的應(yīng)用層面。
使用示例
讓我們假設(shè)我們的系統(tǒng)上有一個應(yīng)用服務(wù)器在運(yùn)行。這個服務(wù)器向客戶發(fā)送問候信息。在這種情況下,服務(wù)器使用一個TCP套接字進(jìn)行通信。
該應(yīng)用服務(wù)器被綁定到一個特定的TCP端口。它的套接字地址是該端口和本地網(wǎng)絡(luò)接口的IP地址的組合。由于這個原因,客戶應(yīng)該使用這個特定的套接字地址來連接服務(wù)器。
應(yīng)用例子
現(xiàn)在我們已經(jīng)定義了我們的用例,讓我們開始構(gòu)建服務(wù)器。
應(yīng)用服務(wù)器
首先,我們需要實(shí)例化一個ServerSocket
,用于監(jiān)聽進(jìn)入的連接請求。ServerSocket
類的構(gòu)造函數(shù)需要一個端口號作為參數(shù)。
public class ApplicationServer {
private ServerSocket serverSocket;
private Socket connectedSocket;
public void startServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
connectedSocket = serverSocket.accept();
//...
獲取客戶端的IP地址
現(xiàn)在我們已經(jīng)為進(jìn)入的客戶端建立了Socket
,讓我們看看如何獲得客戶端的IP地址。Socket
實(shí)例包含了遠(yuǎn)程客戶端的套接字地址。我們可以使用getRemoteSocketAddress
方法來檢查這個。
ThegetRemoteSocketAddress
方法返回一個類型為SocketAddress
的對象。這是一個抽象的Java類。在這個例子中,我們知道它是一個TCP/IP連接,所以我們可以把它轉(zhuǎn)換為InetSocketAddress
。
InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress();
正如我們已經(jīng)看到的,一個套接字地址是一個IP地址和端口號的組合。我們可以使用getAddress
來獲得IP地址。這返回一個InetAddress
對象。然而,我們也可以使用getHostAddress
來獲得IP地址的字符串表示。
String clientIpAddress = socketAddress.getAddress()
.getHostAddress();
向客戶端發(fā)送消息
現(xiàn)在,服務(wù)器和客戶端可以交換問候信息。
String msg = in.readLine();
System.out.println("Message received from the client : " + msg);
PrintWriter out = new PrintWriter(connectedSocket.getOutputStream(), true);
out.println("Hello Client !!");
測試應(yīng)用程序
現(xiàn)在讓我們建立一個客戶端應(yīng)用程序來測試我們的代碼。這個客戶端將在一個單獨(dú)的計算機(jī)上運(yùn)行并連接到我們的服務(wù)器。
建立一個客戶端應(yīng)用程序
首先,我們需要使用IP地址和端口號與服務(wù)建立一個Socket
連接。
public class ApplicationClient {
public void connect(String ip, int port) throws IOException {
clientSocket = new Socket(ip, port);
}
}
與服務(wù)器應(yīng)用程序類似,我們將使用BufferedReader
和PrintWriter
來從套接字中讀取和寫入。為了向服務(wù)器發(fā)送消息,讓我們創(chuàng)建一個方法來向連接的套接字寫入。
public void sendGreetings(String msg) throws IOException {
out.println(msg);
String reply = in.readLine();
System.out.println("Reply received from the server :" + reply);
}
運(yùn)行應(yīng)用程序
接下來,讓我們運(yùn)行客戶端應(yīng)用程序,為它選擇一個不常用的端口
之后,我們需要從另一臺電腦上啟動客戶端應(yīng)用程序。在這個例子中,我們假設(shè)服務(wù)器機(jī)器的IP地址是192.168.0.100
,端口5000是不常用的,不會影響其他的服務(wù)。
java -cp com.javanorth.clientaddress.ApplicationClient 192.168.0.100 5000 Hello
這里,我們假設(shè)客戶機(jī)和服務(wù)器在同一個網(wǎng)絡(luò)上。在客戶端與服務(wù)器建立成功的連接后,客戶端的IP地址將被打印在服務(wù)器控制臺。
例如,如果客戶端的IP地址是192.168.0.102,我們應(yīng)該能在控制臺中看到它。
IP address of the connected client: 192.168.0.102
在后臺發(fā)生了什么?
一般來說,當(dāng)應(yīng)用服務(wù)器被啟動時,ServerSocket
使用給定的端口號和通配符IP地址實(shí)例化一個套接字對象。之后,它將其狀態(tài)改為監(jiān)聽
,以接收連接請求。然后,當(dāng)客戶端發(fā)送一個連接請求時,ServerSocket
通過調(diào)用accept
方法實(shí)例化一個新的套接字。
新創(chuàng)建的套接字實(shí)例包含服務(wù)器的IP地址和端口,以及遠(yuǎn)程客戶端。對于服務(wù)器的IP地址,ServerSocket
類使用本地網(wǎng)絡(luò)接口的IP地址,它通過該接口收到傳入的請求。然后,為了獲得遠(yuǎn)程客戶端的IP地址,它對收到的TCP數(shù)據(jù)包的IP頭進(jìn)行解碼并使用源地址。
總結(jié)
在這篇文章中,我們定義了一個客戶機(jī)-服務(wù)器用例,并使用Java套接字編程來查找連接到服務(wù)器的客戶機(jī)的IP地址。
-
計算機(jī)
+關(guān)注
關(guān)注
19文章
7549瀏覽量
88718 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9331瀏覽量
86131 -
JAVA
+關(guān)注
關(guān)注
19文章
2976瀏覽量
105211 -
ip地址
+關(guān)注
關(guān)注
0文章
303瀏覽量
17143 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3296瀏覽量
57946
發(fā)布評論請先 登錄
相關(guān)推薦
關(guān)于labview服務(wù)器和客戶端程序移植到另一臺電腦的問題
Intel Unite:無法將客戶端連接到Unite服務(wù)器
為什么我用labview編寫的服務(wù)器只可以連接本機(jī)的客戶端
兩個STM32服務(wù)器如何連接做客戶端的stm32?
PIC24+ENC28J60同時客戶端和服務(wù)器
DHCP客戶端如何將主機(jī)名發(fā)送到服務(wù)器?
求助:labview 關(guān)于TCP通訊,如何讓客戶端以指定的IP地址去連接服務(wù)器
如何將ESP8266與Windows計算機(jī)上運(yùn)行的tcp套接字服務(wù)器程序連接?
如何創(chuàng)建客戶端將連接到服務(wù)器的網(wǎng)狀網(wǎng)絡(luò)?
計算機(jī)的客戶端和服務(wù)器
瘦客戶端的服務(wù)器和網(wǎng)絡(luò)技術(shù)
![瘦<b class='flag-5'>客戶端</b>的<b class='flag-5'>服務(wù)器</b>和網(wǎng)絡(luò)技術(shù)](https://file.elecfans.com/web2/M00/49/04/pYYBAGKhtDOANB-DAAASlPAJ0jM669.jpg)
根據(jù)客戶端IP地址獲取計算機(jī)名_Delphi教程
TCP通信服務(wù)器端和客戶端同機(jī)互傳的簡單示例程序免費(fèi)下載
![TCP通信<b class='flag-5'>服務(wù)器端</b>和<b class='flag-5'>客戶端</b>同機(jī)互傳的簡單示例程序免費(fèi)下載](https://file.elecfans.com/web1/M00/AB/04/o4YBAF2yYnOAdxEIAADokxYolA4162.png)
STM32+LWIP服務(wù)器實(shí)現(xiàn)多客戶端連接
![STM32+LWIP<b class='flag-5'>服務(wù)器</b>實(shí)現(xiàn)多<b class='flag-5'>客戶端</b><b class='flag-5'>連接</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論