0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何找到連接到服務(wù)器的客戶端計(jì)算機(jī)的IP地址

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 11:37 ? 次閱讀

在本文中,我們來(lái)學(xué)習(xí)下如何找到連接到服務(wù)器的客戶端計(jì)算機(jī)的IP地址。我們將創(chuàng)建一個(gè)簡(jiǎn)單的客戶端-服務(wù)器場(chǎng)景,讓我們探索用于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)。我們平時(shí)只關(guān)注TCP/IP的應(yīng)用層面。

使用示例

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

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

應(yīng)用例子

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

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

首先,我們需要實(shí)例化一個(gè)ServerSocket,用于監(jiān)聽(tīng)進(jìn)入的連接請(qǐng)求。ServerSocket類的構(gòu)造函數(shù)需要一個(gè)端口號(hào)作為參數(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方法來(lái)檢查這個(gè)。

ThegetRemoteSocketAddress方法返回一個(gè)類型為SocketAddress的對(duì)象。這是一個(gè)抽象的Java類。在這個(gè)例子中,我們知道它是一個(gè)TCP/IP連接,所以我們可以把它轉(zhuǎn)換為InetSocketAddress

InetSocketAddress socketAddress = (InetSocketAddress) connectedSocket.getRemoteSocketAddress();

正如我們已經(jīng)看到的,一個(gè)套接字地址是一個(gè)IP地址和端口號(hào)的組合。我們可以使用getAddress來(lái)獲得IP地址。這返回一個(gè)InetAddress對(duì)象。然而,我們也可以使用getHostAddress來(lái)獲得IP地址的字符串表示。

String clientIpAddress = socketAddress.getAddress()
    .getHostAddress();

向客戶端發(fā)送消息

現(xiàn)在,服務(wù)器和客戶端可以交換問(wè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 !!");

測(cè)試應(yīng)用程序

現(xiàn)在讓我們建立一個(gè)客戶端應(yīng)用程序來(lái)測(cè)試我們的代碼。這個(gè)客戶端將在一個(gè)單獨(dú)的計(jì)算機(jī)上運(yùn)行并連接到我們的服務(wù)器。

建立一個(gè)客戶端應(yīng)用程序

首先,我們需要使用IP地址和端口號(hào)與服務(wù)建立一個(gè)Socket連接。

public class ApplicationClient {
    public void connect(String ip, int port) throws IOException {
        clientSocket = new Socket(ip, port);
    }
}

與服務(wù)器應(yīng)用程序類似,我們將使用BufferedReaderPrintWriter來(lái)從套接字中讀取和寫(xiě)入。為了向服務(wù)器發(fā)送消息,讓我們創(chuàng)建一個(gè)方法來(lái)向連接的套接字寫(xiě)入。

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)用程序

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

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

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

這里,我們假設(shè)客戶機(jī)和服務(wù)器在同一個(gè)網(wǎng)絡(luò)上。在客戶端與服務(wù)器建立成功的連接后,客戶端的IP地址將被打印在服務(wù)器控制臺(tái)。

例如,如果客戶端的IP地址是192.168.0.102,我們應(yīng)該能在控制臺(tái)中看到它。

IP address of the connected client: 192.168.0.102

在后臺(tái)發(fā)生了什么?

一般來(lái)說(shuō),當(dāng)應(yīng)用服務(wù)器被啟動(dòng)時(shí),ServerSocket使用給定的端口號(hào)和通配符IP地址實(shí)例化一個(gè)套接字對(duì)象。之后,它將其狀態(tài)改為監(jiān)聽(tīng),以接收連接請(qǐng)求。然后,當(dāng)客戶端發(fā)送一個(gè)連接請(qǐng)求時(shí),ServerSocket通過(guò)調(diào)用accept方法實(shí)例化一個(gè)新的套接字。

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

總結(jié)

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7494

    瀏覽量

    87953
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9160

    瀏覽量

    85419
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2967

    瀏覽量

    104750
  • ip地址
    +關(guān)注

    關(guān)注

    0

    文章

    303

    瀏覽量

    17055
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3268

    瀏覽量

    57705
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于labview服務(wù)器客戶端程序移植到另一臺(tái)電腦的問(wèn)題

    本帖最后由 hunterlew 于 2015-3-9 21:54 編輯 各位路過(guò)大神,我有個(gè)這樣的疑問(wèn):今天我在計(jì)算機(jī)A上同時(shí)寫(xiě)了服務(wù)器客戶端程序(共享變量的方法),測(cè)試正常后把服務(wù)器
    發(fā)表于 02-08 18:14

    Intel Unite:無(wú)法將客戶端連接到Unite服務(wù)器

    我無(wú)法將客戶端連接到Intel unite服務(wù)器。我繞過(guò)了證書(shū)檢查和安裝服務(wù)器,服務(wù)器正在運(yùn)行并生成PIN。但是,當(dāng)我將
    發(fā)表于 11-09 11:20

    為什么我用labview編寫(xiě)的服務(wù)器只可以連接本機(jī)的客戶端

    為什么我用labview編寫(xiě)的服務(wù)器只可以連接本機(jī)的客戶端,創(chuàng)建TCP偵聽(tīng)的端口明明和別的計(jì)算機(jī)客戶端端口一樣可就是連不上
    發(fā)表于 03-11 20:46

    兩個(gè)STM32服務(wù)器如何連接客戶端的stm32?

    通信如圖所示。三個(gè)stm32是在一個(gè)板子上的,wifi 為esp8266模塊。兩個(gè)stm32做服務(wù)器和一個(gè)做客戶端。內(nèi)部通信用tcp/ip?,F(xiàn)在有幾個(gè)疑問(wèn):1.上位機(jī)通過(guò)路由,把命令給有WIFI通信
    發(fā)表于 05-13 03:23

    PIC24+ENC28J60同時(shí)客戶端服務(wù)器

    )工作,另一個(gè)模塊將作為客戶端連接到這個(gè)enc_IP&Port2。任何人都可以幫助我實(shí)現(xiàn)這個(gè)設(shè)置以充當(dāng)服務(wù)器來(lái)監(jiān)聽(tīng)連接和操作&作為
    發(fā)表于 03-26 11:18

    DHCP客戶端如何將主機(jī)名發(fā)送到服務(wù)器?

    有沒(méi)有人知道,如果DHCP客戶端和諧,可以將設(shè)備的主機(jī)名返回DNS服務(wù)器。我很感激服務(wù)器在許多情況下把主機(jī)名發(fā)送給客戶端。應(yīng)用程序是當(dāng)你第一次將設(shè)備插入網(wǎng)絡(luò)并從DHCP獲得
    發(fā)表于 05-01 06:44

    求助:labview 關(guān)于TCP通訊,如何讓客戶端以指定的IP地址連接服務(wù)器

    `計(jì)算機(jī)上有2個(gè)以上的IP地址,用LABVIEW編寫(xiě)TCP通訊 客戶端程序時(shí),怎么給客戶端指定一個(gè)IP
    發(fā)表于 03-16 16:47

    如何將ESP8266與Windows計(jì)算機(jī)上運(yùn)行的tcp套接字服務(wù)器程序連接?

    我正在嘗試將 ESP8266 與在我的 Windows 計(jì)算機(jī)上運(yùn)行的 tcp 套接字服務(wù)器程序連接,我開(kāi)發(fā)了一個(gè) C# 應(yīng)用程序運(yùn)行并列出到 IP 172.16.1.85 端口 65
    發(fā)表于 02-23 07:09

    如何創(chuàng)建客戶端連接到服務(wù)器的網(wǎng)狀網(wǎng)絡(luò)?

    的問(wèn)題是:如何創(chuàng)建客戶端連接到服務(wù)器的網(wǎng)狀網(wǎng)絡(luò)(或者服務(wù)器將多次提供與網(wǎng)狀的連接)有任何想法嗎?我錯(cuò)過(guò)了什么?是否有應(yīng)該唯一的
    發(fā)表于 03-02 07:54

    計(jì)算機(jī)客戶端服務(wù)器

    計(jì)算機(jī)客戶端服務(wù)器 一般說(shuō)來(lái),互聯(lián)網(wǎng)上的所有計(jì)算機(jī)可以分成兩種類型:服務(wù)器客戶端。向其他
    發(fā)表于 08-05 08:57 ?1843次閱讀

    客戶端服務(wù)器和網(wǎng)絡(luò)技術(shù)

    基于服務(wù)器計(jì)算代表著一種應(yīng)用程序部署方法。 對(duì)以下基于服務(wù)器計(jì)算環(huán)境而言,瘦客戶端是理想的客戶端
    發(fā)表于 07-02 16:46 ?17次下載
    瘦<b class='flag-5'>客戶端</b>的<b class='flag-5'>服務(wù)器</b>和網(wǎng)絡(luò)技術(shù)

    根據(jù)客戶端IP地址獲取計(jì)算機(jī)名_Delphi教程

    Delphi教程根據(jù)客戶端IP地址獲取計(jì)算機(jī)名,很好的Delphi學(xué)習(xí)資料。
    發(fā)表于 03-16 14:54 ?10次下載

    TCP通信服務(wù)器端客戶端同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是TCP通信服務(wù)器端客戶端同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載初學(xué)者學(xué)習(xí)。本例子是本計(jì)算機(jī)labview程序之間的通信,如果要想實(shí)現(xiàn)計(jì)算機(jī)
    發(fā)表于 10-25 08:00 ?9次下載
    TCP通信<b class='flag-5'>服務(wù)器端</b>和<b class='flag-5'>客戶端</b>同機(jī)互傳的簡(jiǎn)單示例程序免費(fèi)下載

    STM32+LWIP服務(wù)器實(shí)現(xiàn)多客戶端連接

    用過(guò)正點(diǎn)原子LWIP服務(wù)器例程開(kāi)發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個(gè)客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子
    發(fā)表于 12-23 19:59 ?61次下載
    STM32+LWIP<b class='flag-5'>服務(wù)器</b>實(shí)現(xiàn)多<b class='flag-5'>客戶端</b><b class='flag-5'>連接</b>

    數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端

    你有想過(guò)嗎,在計(jì)算機(jī)網(wǎng)絡(luò)當(dāng)中,數(shù)據(jù)是怎么樣保證準(zhǔn)確的從客戶端發(fā)送到服務(wù)器端的?中間涉及到了哪些理論?
    的頭像 發(fā)表于 07-01 10:09 ?2086次閱讀