java - 在 java 中创建一个客户端-服务器应用程序,其中两台机器都可以有动态 IP 地址

标签 java sockets dynamic-ip

这就是我打算做的。假设有 2 台机器 A 和 B。我需要使用 Java SE 创建一个应用程序,机器 A 可以通过它向机器 B 发送数据。

我知道要建立连接,您需要创建一个 serversocket 类的对象并使用 accept() 方法作为

在机器 B 中: ServerSocket ss=new ServerSocket(12000);

同时(真)

{

套接字 s=ss.accept();

      .
      .
      .
      .

在机器 A 中:

Socket s=new Socket("<机器B的IP地址>",12000);

                .
                .
                .
                .

问题来了。

假设如果机器 B 的 IP 地址是使用 DHCP 动态分配的,即它可以在每次机器重新启动时更改。

有什么方法可以让机器 A 中的 Java Pgm 无需用户手动输入就可以识别 B 的 IP 地址???

希望您的问题很清楚。 等待答复!

最佳答案

大多数 DNS 服务器都有一种机制,允许 DHCP 服务器对本地(内部)区域进行动态更新。如果您可以随意使用此功能,那么您可以只使用 DNS 名称,并让系统人员确保 DNS 记录与 DHCP 租约保持同步。

可以使用像 dyndns 这样的 DDNS 服务在更广泛的互联网上实现类似的基于 DNS 的方法。 .

如果您不能使用 DNS,那么您只能使用基于 UDP 广播的方法。这与 DHCP、bonjour 和 SMB 等协议(protocol)用于在不知道其地址的情况下在本地网络上查找其他计算机的机制相同;并且这种方法仅适用于那些技术适用的相同环境(通常,仅适用于本地网络,绝对不适用于更大的互联网)。

在 java 中,您将通过 DatagramSocket 完成 UDP 广播消息传递类。

引用 api 文档:

UDP broadcasts sends are always enabled on a DatagramSocket. In order to receive broadcast packets a DatagramSocket should be bound to the wildcard address. In some implementations, broadcast packets may also be received when a DatagramSocket is bound to a more specific address.

Example:

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress(8888)); 

Which is equivalent to:

DatagramSocket s = new DatagramSocket(8888); 

Both cases will create a DatagramSocket able to receive broadcasts on UDP port 8888.\

如果您的两台机器位于 Internet 上的不同位置,并且您不能使用 DDNS 服务(如上面提到的 dyndns),那么最好的办法是构建一个中央注册服务器。这将是一个在互联网上已知地址运行的简单服务器(甚至可以是 Web 服务)。您的每台客户端机器都会向中央注册服务器注册,因此中央注册服务器会知道两台机器的 IP 地址。然后每台机器都可以通过中央注册服务器请求对方的地址。您必须考虑安全性,以防止您的注册表遭到恶意“中毒”,否则,这将是相当简单的。


编辑:

我刚刚发现 JXTA .它是一组用于构建具有对等网络功能的 Java 应用程序的工具。我对它没有任何直接经验,但看起来它会完成您正在寻找的东西(并且可能会为您节省大量工作,而不必从头开始构建它)。

实际上,它看起来像子项目p2psockets完全按照您的意愿行事。

关于java - 在 java 中创建一个客户端-服务器应用程序,其中两台机器都可以有动态 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697878/

相关文章:

java - socket.setTcpNoDelay(true) 不起作用

c++ - 从服务器c++向客户端发送命令

java - 获取动态IP地址Java?

java - 尝试从 jframe 制作屏幕保护程序,无法切换图像

python - 套接字错误 : Address already in use

java - 动态 IP 地址套接字

java - 在通过 RESTful WS 返回之前将元数据附加到对象的适当方法是什么?

javax.net.ssl.SSLException : hostname in certificate didn't match in conjunction with Apache httpd virtual hosts 异常

java - Hashcode 相等是否意味着引用基于引用的相等?