java - 如何通过互联网在两台计算机之间发送数据

标签 java sockets

我一整天都在为这个问题苦苦挣扎,我希望有人能帮我解决这个问题。

我的问题很简单:我希望通过互联网将数据(主要是简单的命令)从一台 PC 传输到另一台 PC。

当两台计算机都连接到我的家庭路由器时,我已经能够使用 Java 中的套接字实现此目的。然后我用两部不同的手机将两台电脑连接到互联网,并尝试再次传输数据。我使用手机,因为它提供了到互联网的直接路由,如果我使用我的路由器,我必须设置端口转发,至少,我是这么理解的。

我认为问题出在我设置客户端套接字的方法上。我用过:

Socket kkSocket = new Socket(ipAddress, 3333);

其中 ipAddress 是运行服务器的计算机的 IP 地址。我通过右键单击连接、状态、支持获得了 IP 地址。这是要使用的正确 IP 地址吗?我在哪里可以获取服务器地址?另外,是否可以为我的计算机获取一个固定名称,我可以使用它来代替输入 IP 地址,因为每次我使用手机连接到互联网时,这个名称都会改变?

或者,是否有更好的方法来解决我的问题,例如使用 http,如果有,我在哪里可以找到更多相关信息?

编辑: 是否可以让服务器程序在 Internet 某处的服务器上运行。然后,我的原始服务器将成为向该服务器发送信息的客户端。该服务器然后会将此信息传递给我的原始客户端,反之亦然。这样一来,我电脑的 IP 地址就无关紧要了,因为我只需要知道托管在网络某处的服务器地址即可。这看起来是更好的解决方案吗?我从哪里开始实现这样的解决方案?

谢谢!

最佳答案

当您连接到为 StackOverflow 提供服务的服务器时,您是否输入了 IP 地址?它是 64.34.119.12,如果这能唤起您的内存的话。

你可能没有。您可能输入了“stackoverflow.com”。有一个巨大的、复杂的、聪明的和in some ways ,执行不力的系统称为DNS将合理且人类可读的名称转换为 IP 地址。

不过,DNS 的一个问题是您需要一个“静态 IP”,这正是它听起来的样子:一个不会改变的 IP 地址,这正是您所没有的。

那么,你能做什么?

  1. 您可以从您的 ISP 购买静态 IP 帐户(相当昂贵)
  2. 您可以在 Internet 上使用一些代理(一台机器确实有一个静态 IP 并且愿意来回发送您的数据包——我不知道有任何服务这样做这个给你;你可以写一个并把它放在 Amazon Web Services 或 Google App Engine 上,这两者在你的使用水平上都是免费的,但它们会很慢,因为每个试图穿过你客厅的数据包都会必须通过弗吉尼亚州的一些数据中心)。
  3. 您可以继续做您正在做的事情,查看您机器的网络配置。
  4. 您可以加快 (3) 的速度,方法是让您的服务器程序查找自己的 IP 地址并将其打印在您可以看到的地方,然后手动将其输入服务器。
  5. 您可以使用 DynDNS,正如 Sergey 提到的(这是“正确”的解决方案,因为它非常通用,只是设置起来可能有点复杂)
  6. 您可以使用 multi-casting .

多播是一个有趣的解决方案,它可能适合您。这个想法是,当您的服务器启动时,它会向网络宣布,“我在这里,我正在提供 X 服务器,这是我的 IP 地址,请与我交谈。”问题是,多播不会离开您的客厅。显然,如果每个多播都传播到 Internet 上的每台计算机,整个事情就会崩溃,因此您的路由器将忽略而不是路由多播数据包。这对您来说可能会或可能不会破坏交易。 编辑 重新阅读您的问题,我发现它对您来说是一个交易破坏者。我会选择#5,但请注意可能存在路由问题(地址转换阻止服务器知道其他计算机可以找到的地址)或防火墙问题(也就是说,您的 ISP 可能会阻止您的服务器即使地址正确,也无法接收传入的数据包)。

关于java - 如何通过互联网在两台计算机之间发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5127687/

相关文章:

c - 从混杂的网络设备读取

python - 在 Python 中查找多播 UDP 消息发件人的 MAC 地址?

时间:2019-05-17 标签:c#socketconnectaddressfamily

java - Mysql插入与选择不同

java - 拆分 Java 构建器以避免多次编写相同的代码

java - DataInputStream 的 read() 中的 -1 是什么意思?

c - Linux C定义缓冲区

java - java HashMap 的快速失败行为

java - 从 Integer java 列表的列表中查找第一个元素

java - 如何在Session Beans中使用自定义异常?