自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java 如何通過 Socket 查詢 IP ?

開發(fā) 前端
在這篇文章中,我們定義了一個客戶機-服務(wù)器用例,并使用Java套接字編程來查找連接到服務(wù)器的客戶機的IP地址。

大家好,我是指北君。

在本文中,我們來學(xué)習(xí)下如何找到連接到服務(wù)器的客戶端計算機的IP地址。我們將創(chuàng)建一個簡單的客戶端-服務(wù)器場景,讓我們探索用于TCP/IP通信的java.net API。

背景

Java應(yīng)用程序使用套接字在互聯(lián)網(wǎng)上進行通信和發(fā)送數(shù)據(jù)。Java為客戶端應(yīng)用程序提供了java.net.Socket類。

java.net.ServerSocket類用于TCP/IP的服務(wù)器端套接字實現(xiàn)。我們平時只關(guān)注TCP/IP的應(yīng)用層面。

使用示例

讓我們假設(shè)我們的系統(tǒng)上有一個應(yīng)用服務(wù)器在運行。這個服務(wù)器向客戶發(fā)送問候信息。在這種情況下,服務(wù)器使用一個TCP套接字進行通信。

該應(yīng)用服務(wù)器被綁定到一個特定的TCP端口。它的套接字地址是該端口和本地網(wǎng)絡(luò)接口的IP地址的組合。由于這個原因,客戶應(yīng)該使用這個特定的套接字地址來連接服務(wù)器。

應(yīng)用例子

現(xiàn)在我們已經(jīng)定義了我們的用例,讓我們開始構(gòu)建服務(wù)器。

應(yīng)用服務(wù)器

首先,我們需要實例化一個ServerSocket?,用于監(jiā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)為進入的客戶端建立了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)在,服務(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)用程序來測試我們的代碼。這個客戶端將在一個單獨的計算機上運行并連接到我們的服務(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īng)用程序

接下來,讓我們運行客戶端應(yīng)用程序,為它選擇一個不常用的端口

之后,我們需要從另一臺電腦上啟動客戶端應(yīng)用程序。在這個例子中,我們假設(shè)服務(wù)器機器的IP地址是192.168.0.100,端口5000是不常用的,不會影響其他的服務(wù)。

java -cp com.javanorth.clientaddress.ApplicationClient 192.168.0.100 5000 Hello

這里,我們假設(shè)客戶機和服務(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地址實例化一個套接字對象。之后,它將其狀態(tài)改為監(jiān)聽?,以接收連接請求。然后,當(dāng)客戶端發(fā)送一個連接請求時,ServerSocket?通過調(diào)用accept方法實例化一個新的套接字。

新創(chuàng)建的套接字實例包含服務(wù)器的IP地址和端口,以及遠程客戶端。對于服務(wù)器的IP地址,ServerSocket類使用本地網(wǎng)絡(luò)接口的IP地址,它通過該接口收到傳入的請求。然后,為了獲得遠程客戶端的IP地址,它對收到的TCP數(shù)據(jù)包的IP頭進行解碼并使用源地址。

總結(jié)

在這篇文章中,我們定義了一個客戶機-服務(wù)器用例,并使用Java套接字編程來查找連接到服務(wù)器的客戶機的IP地址。

責(zé)任編輯:武曉燕 來源: Java技術(shù)指北
相關(guān)推薦

2010-03-19 10:58:48

Java Socket

2009-07-06 18:28:26

Java Socket

2012-03-19 10:55:27

JavaSocket

2015-04-24 09:48:59

TCPsocketsocket編程

2021-08-04 08:55:02

Socket Java開發(fā)

2011-07-22 17:48:29

IOS Socket TCP

2012-03-19 11:41:30

JavaSocket

2010-03-19 13:48:15

Java Socket

2015-03-03 13:47:34

HttpTCPIP

2010-03-19 16:28:51

Java Socket

2010-03-23 17:44:10

Java Socket

2010-03-19 11:12:23

Java Socket

2015-03-18 09:21:53

編程Java死鎖

2012-02-15 13:26:39

JavaJava Socket

2021-08-08 09:19:18

IPinfogaIP地址安全工具

2010-03-19 17:04:01

Java socket

2010-03-19 14:01:55

Java Socket

2013-04-08 11:02:43

Socket服務(wù)C#

2011-06-13 11:23:33

javasocket

2011-06-13 12:11:06

javasocket
點贊
收藏

51CTO技術(shù)棧公眾號