詳解Java如何通過Socket實現(xiàn)查詢IP
在本文中,我們來學習下如何找到連接到服務器的客戶端計算機的IP地址。我們將創(chuàng)建一個簡單的客戶端-服務器場景,讓我們探索用于TCP/IP通信的java.net API。
背景
Java應用程序使用套接字在互聯(lián)網(wǎng)上進行通信和發(fā)送數(shù)據(jù)。Java為客戶端應用程序提供了java.net.Socket類。
java.net.ServerSocket類用于TCP/IP的服務器端套接字實現(xiàn)。我們平時只關注TCP/IP的應用層面。
使用示例
讓我們假設我們的系統(tǒng)上有一個應用服務器在運行。這個服務器向客戶發(fā)送問候信息。在這種情況下,服務器使用一個TCP套接字進行通信。
該應用服務器被綁定到一個特定的TCP端口。它的套接字地址是該端口和本地網(wǎng)絡接口的IP地址的組合。由于這個原因,客戶應該使用這個特定的套接字地址來連接服務器。
應用例子
現(xiàn)在我們已經(jīng)定義了我們的用例,讓我們開始構建服務器。
應用服務器
首先,我們需要實例化一個ServerSocket,用于監(jiān)聽進入的連接請求。ServerSocket類的構造函數(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)為進入的客戶端建立了Socket,讓我們看看如何獲得客戶端的IP地址。Socket實例包含了遠程客戶端的套接字地址。我們可以使用getRemoteSocketAddress方法來檢查這個。
ThegetRemoteSocketAddress方法返回一個類型為SocketAddress的對象。這是一個抽象的Java類。在這個例子中,我們知道它是一個TCP/IP連接,所以我們可以把它轉換為InetSocketAddress。
InetSocketAddress?socketAddress?=?(InetSocketAddress)?connectedSocket.getRemoteSocketAddress();
正如我們已經(jīng)看到的,一個套接字地址是一個IP地址和端口號的組合。我們可以使用getAddress來獲得IP地址。這返回一個InetAddress對象。然而,我們也可以使用getHostAddress來獲得IP地址的字符串表示。
String?clientIpAddress?=?socketAddress.getAddress() ????.getHostAddress();
向客戶端發(fā)送消息
現(xiàn)在,服務器和客戶端可以交換問候信息。
String?msg?=?in.readLine();
System.out.println("Message?received?from?the?client?:?"?+?msg);
PrintWriter?out?=?new?PrintWriter(connectedSocket.getOutputStream(),?true);
out.println("Hello?Client?!!");
測試應用程序
現(xiàn)在讓我們建立一個客戶端應用程序來測試我們的代碼。這個客戶端將在一個單獨的計算機上運行并連接到我們的服務器。
建立一個客戶端應用程序
首先,我們需要使用IP地址和端口號與服務建立一個Socket連接。
public?class?ApplicationClient?{
????public?void?connect(String?ip,?int?port)?throws?IOException?{
????????clientSocket?=?new?Socket(ip,?port);
????}
}
與服務器應用程序類似,我們將使用BufferedReader和PrintWriter來從套接字中讀取和寫入。為了向服務器發(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);
}
運行應用程序
接下來,讓我們運行客戶端應用程序,為它選擇一個不常用的端口
之后,我們需要從另一臺電腦上啟動客戶端應用程序。在這個例子中,我們假設服務器機器的IP地址是192.168.0.100,端口5000是不常用的,不會影響其他的服務。
java?-cp?com.javanorth.clientaddress.ApplicationClient?192.168.0.100?5000?Hello
這里,我們假設客戶機和服務器在同一個網(wǎng)絡上。在客戶端與服務器建立成功的連接后,客戶端的IP地址將被打印在服務器控制臺。
例如,如果客戶端的IP地址是192.168.0.102,我們應該能在控制臺中看到它。
IP address of the connected client: 192.168.0.102
在后臺發(fā)生了什么
一般來說,當應用服務器被啟動時,ServerSocket使用給定的端口號和通配符IP地址實例化一個套接字對象。之后,它將其狀態(tài)改為監(jiān)聽,以接收連接請求。然后,當客戶端發(fā)送一個連接請求時,ServerSocket通過調(diào)用accept方法實例化一個新的套接字。
新創(chuàng)建的套接字實例包含服務器的IP地址和端口,以及遠程客戶端。對于服務器的IP地址,ServerSocket類使用本地網(wǎng)絡接口的IP地址,它通過該接口收到傳入的請求。然后,為了獲得遠程客戶端的IP地址,它對收到的TCP數(shù)據(jù)包的IP頭進行解碼并使用源地址。
總結
在這篇文章中,我們定義了一個客戶機-服務器用例,并使用Java套接字編程來查找連接到服務器的客戶機的IP地址。
以上就是詳解Java如何通過Socket實現(xiàn)查詢IP的詳細內(nèi)容,更多關于Java Socket查詢IP的資料請關注腳本之家其它相關文章!
相關文章
企業(yè)級Kubernetes管理平臺Wayne功能特性介紹
這篇文章主要為大家介紹了企業(yè)級Kubernetes管理平臺Wayne的功能特性及架構設計,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02
SpringCloud筆記(Hoxton)Netflix之Ribbon負載均衡示例代碼
這篇文章主要介紹了SpringCloud筆記HoxtonNetflix之Ribbon負載均衡,Ribbon是管理HTTP和TCP服務客戶端的負載均衡器,Ribbon具有一系列帶有名稱的客戶端(Named?Client),對SpringCloud?Ribbon負載均衡相關知識感興趣的朋友一起看看吧2022-06-06
Springboot+jwt實現(xiàn)在線用戶功能(示例代碼)
這篇文章主要介紹了Springboot+jwt實現(xiàn)在線用戶功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-12-12
springboot攔截器無法注入redisTemplate的解決方法
在工作中我們經(jīng)常需要做登錄攔截驗證或者其他攔截認證功能,但是在寫攔截器的時候發(fā)現(xiàn)redisTemplate一直無法注入進來,本文就詳細的介紹了解決方法,感興趣的可以了解一下2021-06-06
mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析
這篇文章主要介紹了mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

