最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java如何通過Socket實現(xiàn)查詢IP

 更新時間:2022年10月10日 08:40:54   作者:指北君  
在本文中,我們來學習下如何找到連接到服務器的客戶端計算機的IP地址。我們將創(chuàng)建一個簡單的客戶端-服務器場景,讓我們探索用于TCP/IP通信的java.net?API,感興趣的可以了解一下

在本文中,我們來學習下如何找到連接到服務器的客戶端計算機的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);
????}
}

與服務器應用程序類似,我們將使用BufferedReaderPrintWriter來從套接字中讀取和寫入。為了向服務器發(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的資料請關注腳本之家其它相關文章!

相關文章

  • 使用Nexus搭建Maven私服教程的方法步驟

    使用Nexus搭建Maven私服教程的方法步驟

    本文主要介紹了使用Nexus搭建Maven私服教程的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • 企業(yè)級Kubernetes管理平臺Wayne功能特性介紹

    企業(yè)級Kubernetes管理平臺Wayne功能特性介紹

    這篇文章主要為大家介紹了企業(yè)級Kubernetes管理平臺Wayne的功能特性及架構設計,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • SpringCloud筆記(Hoxton)Netflix之Ribbon負載均衡示例代碼

    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)在線用戶功能(示例代碼)

    這篇文章主要介紹了Springboot+jwt實現(xiàn)在線用戶功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 如何改變idea和maven中的sdk版本

    如何改變idea和maven中的sdk版本

    這篇文章主要介紹了如何改變idea和maven中的sdk版本,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • 詳細聊一聊java中封裝的那點事

    詳細聊一聊java中封裝的那點事

    封裝是一個非常廣泛的概念,小到一個屬性的封裝,大到一個框架或者一個項目的封裝,下面這篇文章主要給大家介紹了關于java中封裝的那點事,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-04-04
  • springboot攔截器無法注入redisTemplate的解決方法

    springboot攔截器無法注入redisTemplate的解決方法

    在工作中我們經(jīng)常需要做登錄攔截驗證或者其他攔截認證功能,但是在寫攔截器的時候發(fā)現(xiàn)redisTemplate一直無法注入進來,本文就詳細的介紹了解決方法,感興趣的可以了解一下
    2021-06-06
  • Spring Boot Mybatis++ 2025詳解

    Spring Boot Mybatis++ 2025詳解

    文章介紹了三種基于注解SQL和查詢接口的MyBatis使用方式,討論了Entity和Example的區(qū)別,即Entity會更新所有字段,而Example僅更新非空字段,感興趣的朋友一起看看吧
    2025-02-02
  • mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析

    mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析

    這篇文章主要介紹了mybatis主從表關聯(lián)查詢,返回對象帶有集合屬性解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 解析java中的condition

    解析java中的condition

    Condition 將 Object 監(jiān)視器方法(wait()、notify()和notifyAll())分解成截然不同的對象,以便通過將這些對象與任意Lock實現(xiàn)組合使用,為每個對象提供多個等待 set(wait-set)
    2021-06-06

最新評論

阳春市| 进贤县| 谷城县| 灵台县| 南开区| 承德市| 古田县| 元谋县| 富阳市| 昭苏县| 独山县| 辉南县| 蓬溪县| 伽师县| 固原市| 云安县| 滨海县| 民县| 屯门区| 西宁市| 子洲县| 五台县| 醴陵市| 青河县| 宝清县| 秀山| 崇州市| 惠东县| 固始县| 营山县| 嘉禾县| 鹿泉市| 肃北| 大新县| 遵义县| 社会| 辽源市| 积石山| 许昌县| 晋州市| 舒兰市|