欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解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連接,所以我們可以把它轉(zhuǎn)換為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的資料請關注腳本之家其它相關文章!

相關文章

  • Java那點事——StringBuffer與StringBuilder原理與區(qū)別

    Java那點事——StringBuffer與StringBuilder原理與區(qū)別

    本文給大家分享StringBuffer與StringBuilder的區(qū)別,它們的應用場景是什么?非常不錯,面試考官經(jīng)常考的一個問題,有需要的朋友跟著腳本之家小編一起學習吧
    2016-06-06
  • SchedulingConfigurer實現(xiàn)動態(tài)定時,導致ApplicationRunner無效解決

    SchedulingConfigurer實現(xiàn)動態(tài)定時,導致ApplicationRunner無效解決

    這篇文章主要介紹了SchedulingConfigurer實現(xiàn)動態(tài)定時,導致ApplicationRunner無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Mybatis結果集映射與生命周期詳細介紹

    Mybatis結果集映射與生命周期詳細介紹

    結果集映射指的是將數(shù)據(jù)表中的字段與實體類中的屬性關聯(lián)起來,這樣 MyBatis 就可以根據(jù)查詢到的數(shù)據(jù)來填充實體對象的屬性,幫助我們完成賦值操作
    2022-10-10
  • Java8 Optional判空詳解(簡化判空操作)

    Java8 Optional判空詳解(簡化判空操作)

    這篇文章主要給大家介紹了關于Java8 Optional判空(簡化判空操作)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • java代碼如何讀取bootstrap.yml配置信息

    java代碼如何讀取bootstrap.yml配置信息

    這篇文章主要介紹了java代碼如何讀取bootstrap.yml配置信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • JVM代碼緩存區(qū)CodeCache原理及用法解析

    JVM代碼緩存區(qū)CodeCache原理及用法解析

    這篇文章主要介紹了JVM代碼緩存區(qū)CodeCache原理及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot @ConfigurationProperties注解的簡單使用

    SpringBoot @ConfigurationProperties注解的簡單使用

    即便現(xiàn)在簡化了配置,但是一個獨立的配置文件總是易于理解而且使人安心的。Spring在構建完項目后,會默認在resources文件夾下創(chuàng)建一個application.properties文件,application.yml也是一樣的效果。@ConfigurationProperties可以獲取配置文件中的數(shù)據(jù),將其注入類。
    2021-05-05
  • Java通過PowerMockito和Mokito進行單元測試的實現(xiàn)

    Java通過PowerMockito和Mokito進行單元測試的實現(xiàn)

    PowerMockito和Mockito都是Java語言中的測試框架,用于進行單元測試和集成測試,本文就來詳細的介紹一下通過PowerMockito和Mokito進行單元測試,感興趣的可以了解一下
    2023-08-08
  • SpringBoot2中使用@RequestHeader獲取請求頭的方法

    SpringBoot2中使用@RequestHeader獲取請求頭的方法

    springMVC/SpringBoot中提供了@RequestHeader注解用來獲取請求頭。本文就詳細的來介紹一下如何使用,感興趣的可以了解下
    2021-10-10
  • Java操作Zookeeper原理及過程詳解

    Java操作Zookeeper原理及過程詳解

    這篇文章主要介紹了Java操作Zookeeper原理及過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論