概述
在这个快速教程中,我们将学习如何找到连接到服务器的客户端计算机的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
连接:
与服务器应用类似,我们将使用BufferedReader
和PrintWriter
从套接字读取和写入数据。为了向服务器发送消息,我们可以创建一个方法来向连接的套接字写入:
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上找到。