概述

在这个快速教程中,我们将学习如何找到连接到服务器的客户端计算机的IP地址。我们将构建一个简单的客户端-服务器场景,以便探索用于TCP/IP通信的java.net API。

背景

Java应用程序使用套接字通过互联网进行通信和发送数据。对于客户端应用,Java提供了java.net.Socket类。而对于基于TCP/IP的服务器端套接字实现,我们使用java.net.ServerSocket类。然而,本教程将专注于TCP/IP应用。

示例用例

假设我们的系统上运行着一个应用服务器,它向客户端发送问候信息。在这种情况下,服务器使用TCP套接字进行通信。应用服务器绑定到特定的TCP端口。其套接字地址是该端口和本地网络接口的IP地址的组合。因此,客户端应使用这个特定的套接字地址来连接服务器。

示例应用

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

4.1. 应用服务器

首先,我们需要创建一个ServerSocket来监听来自客户端的连接请求。ServerSocket类的构造函数需要一个端口号作为参数:


4.2. 获取客户端IP地址

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

getRemoteSocketAddress方法返回一个SocketAddress类型的对象。这是一个抽象的Java类。在这种情况下,我们知道这是TCP/IP连接,所以我们可以将其转换为InetSocketAddress


由于我们已经知道,套接字地址是由IP地址和端口号组成的。我们可以使用getAddress来获取IP地址,这将返回一个InetAddress对象。然而,我们也可以使用getHostAddress来获取IP地址的字符串表示形式:


4.3. 向客户端发送问候消息

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


测试应用

现在,让我们构建一个客户端应用来测试我们的代码。这个客户端将在另一台计算机上运行,并连接到我们的服务器。

5.1. 构建客户端应用

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


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


5.2. 运行应用

接下来,从另一台PC启动客户端应用,为其选择一个空闲的端口。

然后,我们需要在另一台电脑上启动客户端应用。例如,假设服务器机器的IP地址是192.168.0.100,并且端口5000是空闲的:


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

如果客户端的IP地址,比如是192.168.0.102,我们应在控制台上看到它:


5.3. 背景原理

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

新创建的套接字实例包含了服务器的IP地址和端口,以及远程客户端的信息。对于服务器的IP地址,ServerSocket类使用接收连接请求的本地网络接口的IP地址。然后,为了获取远程客户端的IP地址,它解析接收到的TCP报文的IP头,并使用源地址。

总结

在这篇文章中,我们定义了一个示例的客户端-服务器用例,并使用Java套接字编程找到了连接到服务器的客户端的IP地址。如往常一样,该应用的代码可以在GitHub上找到。


» 下一篇: Java Weekly, 第402期