0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何找到连接到服务器的客户端计算机的IP地址

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 11:37 次阅读

在本文中,我们来学习下如何找到连接到服务器的客户端计算机的IP地址。我们将创建一个简单的客户端-服务器场景,让我们探索用于TCP/IP通信java.net API

背景

Java应用程序使用套接字在互联网上进行通信和发送数据。Java为客户端应用程序提供了java.net.Socket类。

java.net.ServerSocket类用于TCP/IP的服务器端套接字实现。我们平时只关注TCP/IP的应用层面。

使用示例

让我们假设我们的系统上有一个应用服务器在运行。这个服务器向客户发送问候信息。在这种情况下,服务器使用一个TCP套接字进行通信。

该应用服务器被绑定到一个特定的TCP端口。它的套接字地址是该端口和本地网络接口的IP地址的组合。由于这个原因,客户应该使用这个特定的套接字地址来连接服务器。

应用例子

现在我们已经定义了我们的用例,让我们开始构建服务器。

应用服务器

首先,我们需要实例化一个ServerSocket,用于监听进入的连接请求。ServerSocket类的构造函数需要一个端口号作为参数

public class ApplicationServer {

    private ServerSocket serverSocket;
    private Socket connectedSocket;
  
    public void startServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        connectedSocket = serverSocket.accept();
        //...

获取客户端的IP地址

现在我们已经为进入的客户端建立了Socket,让我们看看如何获得客户端的IP地址。Socket实例包含了远程客户端的套接字地址。我们可以使用getRemoteSocketAddress方法来检查这个。

ThegetRemoteSocketAddress方法返回一个类型为SocketAddress的对象。这是一个抽象的Java类。在这个例子中,我们知道它是一个TCP/IP连接,所以我们可以把它转换为InetSocketAddress

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

正如我们已经看到的,一个套接字地址是一个IP地址和端口号的组合。我们可以使用getAddress来获得IP地址。这返回一个InetAddress对象。然而,我们也可以使用getHostAddress来获得IP地址的字符串表示。

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

向客户端发送消息

现在,服务器和客户端可以交换问候信息。

String msg = in.readLine();
System.out.println("Message received from the client : " + msg);
PrintWriter out = new PrintWriter(connectedSocket.getOutputStream(), true);
out.println("Hello Client !!");

测试应用程序

现在让我们建立一个客户端应用程序来测试我们的代码。这个客户端将在一个单独的计算机上运行并连接到我们的服务器。

建立一个客户端应用程序

首先,我们需要使用IP地址和端口号与服务建立一个Socket连接。

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

与服务器应用程序类似,我们将使用BufferedReaderPrintWriter来从套接字中读取和写入。为了向服务器发送消息,让我们创建一个方法来向连接的套接字写入。

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

这里,我们假设客户机和服务器在同一个网络上。在客户端与服务器建立成功的连接后,客户端的IP地址将被打印在服务器控制台。

例如,如果客户端的IP地址是192.168.0.102,我们应该能在控制台中看到它。

IP address of the connected client: 192.168.0.102

在后台发生了什么?

一般来说,当应用服务器被启动时,ServerSocket使用给定的端口号和通配符IP地址实例化一个套接字对象。之后,它将其状态改为监听,以接收连接请求。然后,当客户端发送一个连接请求时,ServerSocket通过调用accept方法实例化一个新的套接字。

新创建的套接字实例包含服务器的IP地址和端口,以及远程客户端。对于服务器的IP地址,ServerSocket类使用本地网络接口的IP地址,它通过该接口收到传入的请求。然后,为了获得远程客户端的IP地址,它对收到的TCP数据包的IP头进行解码并使用源地址。

总结

在这篇文章中,我们定义了一个客户机-服务器用例,并使用Java套接字编程来查找连接到服务器的客户机的IP地址。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6651

    浏览量

    84560
  • 服务器
    +关注

    关注

    12

    文章

    8120

    浏览量

    82528
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102998
  • ip地址
    +关注

    关注

    0

    文章

    240

    浏览量

    16743
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56400
收藏 人收藏

    评论

    相关推荐

    关于labview服务器客户端程序移植到另一台电脑的问题

    本帖最后由 hunterlew 于 2015-3-9 21:54 编辑 各位路过大神,我有个这样的疑问:今天我在计算机A上同时写了服务器客户端程序(共享变量的方法),测试正常后把服务器
    发表于 02-08 18:14

    Intel Unite:无法将客户端连接到Unite服务器

    我无法将客户端连接到Intel unite服务器。我绕过了证书检查和安装服务器服务器正在运行并生成PIN。但是,当我将
    发表于 11-09 11:20

    为什么我用labview编写的服务器只可以连接本机的客户端

    为什么我用labview编写的服务器只可以连接本机的客户端,创建TCP侦听的端口明明和别的计算机客户端端口一样可就是连不上
    发表于 03-11 20:46

    两个STM32服务器如何连接客户端的stm32?

    通信如图所示。三个stm32是在一个板子上的,wifi 为esp8266模块。两个stm32做服务器和一个做客户端。内部通信用tcp/ip。现在有几个疑问:1.上位机通过路由,把命令给有WIFI通信
    发表于 05-13 03:23

    如何同时开启服务器模式和客户端模式?

    如题,UCOSII或者FreeRtos下使用LWIP如何同时开启服务器模式和客户端模式,我这几天弄了下,单独跑其中一个,都好好的,但是同时跑,客户端连接上了,
    发表于 10-31 03:05

    PIC24+ENC28J60同时客户端服务器

    )工作,另一个模块将作为客户端连接到这个enc_IP&Port2。任何人都可以帮助我实现这个设置以充当服务器来监听连接和操作&作为
    发表于 03-26 11:18

    DHCP客户端如何将主机名发送到服务器

    有没有人知道,如果DHCP客户端和谐,可以将设备的主机名返回DNS服务器。我很感激服务器在许多情况下把主机名发送给客户端。应用程序是当你第一次将设备插入网络并从DHCP获得
    发表于 05-01 06:44

    求助:labview 关于TCP通讯,如何让客户端以指定的IP地址连接服务器

    `计算机上有2个以上的IP地址,用LABVIEW编写TCP通讯 客户端程序时,怎么给客户端指定一个IP
    发表于 03-16 16:47

    4412开发板Qt网络编程-TCP实现服务器客户端

    Protocol)是一种面向连接的,可靠的,基于字节流的传输层通信协议,传输数据稳定可靠。在 help 索引中搜索到如图 两个重要类:服务器编程中两个类都会用到,客户端编程中只会用到 QTcpSocket
    发表于 04-28 15:33

    通讯猫MQTT服务器在线客户端的问题

    我在网上找一个通讯猫MQTT服务器在线客户端。我有点糊涂,到底是服务器,还是客户端。可以连上,也可以发数据,就是不知道跟谁连。我从上面下了个WIN32
    发表于 11-19 12:17

    如何将ESP8266与Windows计算机上运行的tcp套接字服务器程序连接

    我正在尝试将 ESP8266 与在我的 Windows 计算机上运行的 tcp 套接字服务器程序连接,我开发了一个 C# 应用程序运行并列出到 IP 172.16.1.85 端口 65
    发表于 02-23 07:09

    如何创建客户端连接到服务器的网状网络?

    的问题是:如何创建客户端连接到服务器的网状网络(或者服务器将多次提供与网状的连接)有任何想法吗?我错过了什么?是否有应该唯一的
    发表于 03-02 07:54

    当WiFi信号变低时,服务器客户端之间的TCP通信丢失,如何使客户端重新连接

    大家好, 当 WiFi 信号变低时,服务器客户端之间的 TCP 通信丢失,比如超过 -80dBm。一旦客户端断开连接,它就无法重新连接并正
    发表于 05-15 07:31

    计算机客户端服务器

    计算机客户端服务器 一般说来,互联网上的所有计算机可以分成两种类型:服务器客户端。向其他
    发表于 08-05 08:57 1604次阅读

    根据客户端IP地址获取计算机名_Delphi教程

    Delphi教程根据客户端IP地址获取计算机名,很好的Delphi学习资料。
    发表于 03-16 14:54 10次下载