【问题标题】:How do I send data between two computers over the internet如何通过互联网在两台计算机之间发送数据
【发布时间】:2011-07-04 21:40:12
【问题描述】:

我已经为此苦苦挣扎了一整天,希望有人能帮助我。

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

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

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

Socket kkSocket = new Socket(ipAddress, 3333);

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

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

编辑: 是否有可能让服务器程序在某处互联网上的服务器上运行。然后,我的原始服务器将成为向该服务器发送信息的客户端。然后,该服务器会将这些信息传递给我原来的客户端,反之亦然。这样,我的计算机的 IP 地址就无关紧要了,因为我只需要知道托管在网络上某处的服务器的地址。这似乎是一个更好的解决方案?我从哪里开始实施这样的解决方案?

谢谢!

【问题讨论】:

  • 您的问题更多地与互联网协议和通信设置的管理有关,而不是与编程有关。最好在 ServerFault.com 上询问。顺便说一句,你的问题是多层次的。在家庭甚至公司网络上运行相当容易,但是当您进入野外时,您必须考虑防火墙、DNS、ISP(通常不允许服务器流量)等。如果您想在套接字级别编码,你一定要从内而外地学习 TCP/IP。没有逃避它。
  • 关于您在编辑中讨论的策略。有一种非常简单的入门方法:Google App Engine。您必须了解一点关于 servlet 的知识和一点点关于 Google 特定数据存储的知识,但总的工作应该不到一个小时。
  • @Malvolio。谢谢,这听起来是个好主意。如果我创建自己的服务器来执行此操作,会比使用 google 应用引擎更困难吗?
  • 问题是,你需要找一个主机。你必须找一个拥有数据中心的人,让你使用电脑。有很多商业机构会为了钱去做,甚至还有一些其他(部分)免费的,包括Amazon Web Services,您甚至可以建立自己的数据中心,只需一个静态 IP 和一个未使用的Linux 盒子。 GAE 是最简单的,大约一个小时的工作。在 AWS 的免费 Beanstalk 服务上,可能需要两个小时。这些是我这个月自己尝试过的唯一一个,但其他的可能是可比的。

标签: java sockets


【解决方案1】:

无需为此编写网络代码,除非它真的让你的船飘起来。看看SCP。 http://amath.colorado.edu/computing/software/man/scp.html。有一个 windows 实现,您可以在其中下载 putty(windows ssh 客户端),它位于大多数 linux 发行版上。或者,您可以在其中一台或两台机器上设置 FTP 或 SSH 服务器。

“我可以使用的我的计算机的固定名称,而不是输入 IP 地址”将是一个域名,这些可以在网上以几美元的价格购买。

【讨论】:

  • @Orbit:OP 声明他想“传输数据(主要是简单的命令)”scp 是为了复制文件。我不确定这是 OP 想要的。
  • 是的,但在不知道他到底想要什么的情况下尝试了。
  • 他的套接字代码已经可以工作了,所以这个问题更多的是配置问题而不是编程问题。
  • OP 认为他想要的和他需要的是有区别的:在这种情况下,我认为 OP 需要弄清楚互联网上 TCP/IP 的变幻莫测。他已经让他的东西在家 (LAN) 工作,他正试图将其转移到公共互联网 (WAN)。Johan 真的需要了解要实现这样的转移需要发生什么。
  • 没错,我应该忽略问题中的最后一个问题。
【解决方案2】:

使用像 3333 这样的端口的直接套接字连接通常很复杂,因为网络配置不同。

防火墙会很高兴阻止连接或不时终止连接。

保持双向连接可能是个噩梦。 SIP 协议正在努力解决这类问题。

对于一个简单的应用程序,我建议您查看comet technology,您的客户端可以在其中与共享服务器建立 http 连接。然后服务器可以在它们之间桥接命令。

html5 也会将websocket protocol 带到桌面上。

【讨论】:

  • 谢谢,彗星技术听起来很有趣。我想我会看看那个。
  • 如果您不介意我这么说,COMET 方法是使用开放代理的更通用解决方案的一个子集,而且是一种不必要的复杂解决方案。如果您卡在浏览器中并且必须通过 HTTP 隧道,COMET 非常棒,但这里不是这种情况。
  • @Malvolio - 你说得对,我将问题限制为基于浏览器的问题。
【解决方案3】:

我通过右键单击获得了 IP 地址 关于连接、状态、支持。

不确定“支持”部分,而且我现在不在 Windows 机器上,但我认为在 Windows 上找出 IP 地址的最简单可靠的方法是从命令行(Win+R,在打开的窗口中输入“cmd”,然后输入“ipconfig”)。当然,这应该在服务器端完成。

但是,问题在于,根据 ISP,您的 IP 地址可能不在 Internet 内,而是在本地 ISP 网络(所谓的 NAT)内。在这种情况下,您需要使用某种名为TCP hole punching 的黑魔法,它非常复杂且无法保证有效。您可以通过查看地址来确定您的地址是否是本地地址。对于 IPv4,本地地址几乎总是像 10.x.x.x 或 172.16-31.x.x 或 192.168.x.x。不知道 IPv6。

您还可以通过访问 www.whatismyip.com 等特殊网站之一来检查您的 IP。如果他们告诉您的地址与您通过运行“ipconfig”或查看连接属性看到的地址不同,那么您几乎可以肯定是在 NAT 后面(或者您的 ISP 正在使用透明代理,但这种情况很少见)。

如果您直接连接到 Internet(没有本地地址和 NAT),那么您还应该检查您是否有任何防火墙软件,或者将其配置为允许连接到您使用的端口,或者确保它在“询问用户”(而不是“静默拒绝”)模式,或者完全禁用它(这可能会使您的计算机面临风险,尤其是在没有防病毒软件或系统不是最新的情况下)。

另外,是否有可能得到一个固定的 我可以使用的计算机名称 而不是输入 IP 地址,如 每次我连接到时都会改变 用我的手机上网?

是的,这是可能的。有一个叫 DynDNS 的东西,还有像DynDNS.com 这样的 DynDNS 提供商,在那里你可以免费获得一个三级域名(比如 mycoolpc.dyndns.org)。您必须在您的 PC 上安装和配置一些 DynDNS 客户端,该客户端将在每次更改时告诉 DynDNS 服务器其新 IP。我对要使用的特定客户端一无所知,因为我使用的是家庭路由器中的内置客户端。

【讨论】:

  • 谢谢,我检查了,我的 IP 地址以 41 开头。如果我不在 NAT 后面,那么使用的 IP 地址应该有效吗?如何“在 Internet 内”获取我的 IP 地址?我应该使用 DynDNS 来完成这项工作吗?
  • @Johan,如果它以 41 开头,那么您可能直接连接到 Internet。您是否将“ipconfig”返回的地址与whatismyip.com 所说的进行了比较?如果它们相同,那么您肯定是安全的。您应该在客户端使用此地址进行连接。如果您有防火墙软件,您可能必须禁用它或配置打开使用的端口。 DynDNS 不用于获取 IP 地址,它只是为您注册一个名称,而 DynDNS 客户端会在每次更改时更新此名称以指向您的 IP 地址。
  • @Sergey,是的,它们是一样的。我会尝试其他一些选项,可能是防火墙或类似的东西。
  • @Johan,您在尝试连接时遇到了什么错误?
  • @Sergey。几秒钟后,客户端出现 IOException。我编辑了我原来的问题,如果你不介意,你能看看那个,让我知道你的想法。谢谢!
【解决方案4】:

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

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

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

那么,你能做什么呢?

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

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

【讨论】:

  • 静态 IP 地址的成本取决于 ISP。我有两个来自不同 ISP 的连接,一个带有静态 IP,每月大约 2 美元,另一个带有半静态 IP,免费。 “半静态”是指不保证是静态的,只有在 ISP 软件/硬件发生严重变化时才会真正发生变化,并且上次发生在几年前。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多