【问题标题】:How to establish socket connection between two machines with each has no out-net ip preferentially using java?如何在两台没有外网ip的机器之间建立socket连接优先使用java?
【发布时间】:2013-05-07 09:50:07
【问题描述】:

我正在创建一些由服务器和多个客户端组成的软件,并且我需要两个客户端相互传输文件。

其工作流程如下:

  1. 客户端(文件发送方)向服务器发送请求并告诉它我需要向另一个客户端(文件接收方)发送文件。
  2. 服务器返回文件接收客户端的ip,并发送一条消息给文件接收客户端,并告诉他ip为..的人将向您发送文件。
  3. 文件发送者创建一个 SocketServer 并告诉服务器我已经准备好了。
  4. 文件接收器创建一个连接到文件发送器的套接字连接。
  5. 文件发送者开始发送文件。

我在第 4 步遇到问题:由于外网 ip,我无法建立从文件接收方到文件发送方的套接字连接。

这里,out-net ip 表示这个 ip 是机器连接的路由器。机器只有一个路由器分配的内网ip。

【问题讨论】:

  • 如果可能的话,添加一些你已经完成的源代码
  • 其实这是一个我会做的项目。但我在 1 年前就遇到了问题。

标签: java sockets serversocket


【解决方案1】:

前段时间我创建了一个类似的应用程序。如果两个客户端都可以与服务器通信,那么为什么不将服务器用作网桥/网关。我的意思是,服务器将在两个客户端之间发送所有传输文件数据。您不必关闭原始套接字,步骤 1 中创建的套接字和步骤 2 中创建的套接字使用它们在客户端之间进行传输。这只是一个设计良好的协议的问题,在这种情况下,实现起来并不难。

【讨论】:

  • 我知道你的意思,但是这个解决方案只适合小数据传输,比如消息、句子。但是如果我需要处理大文件或大数据,就会占用大量的网络资源和服务器端的负载。
  • 嗯,这取决于您需要和想要做什么,为此目的的专用文件服务器并不昂贵,并且不需要显示器或显卡,也不需要大硬盘,任何旧的 XP 计算机都可以。同样,这取决于您的需要。
  • 谢谢,我想我需要一个文件服务器来在发送者和接收者之间传输文件。
【解决方案2】:

您是否在路由器上转发了相应的端口?否则你的连接会在路由器上断开。

【讨论】:

  • 不,我需要安装和运行这个软件,不需要用户知道网络知识。
  • 如果您需要直接的 P2P 连接,我认为,如果没有端口转发,就无法实现。这在物理上是不可能的,路由器不会让你的数据包到达客户端。
  • 我已经确保在不同路由器下的机器之间建立直接连接是不可能的。
  • 除非我设置了端口转发。我可能需要一个文件传输服务器来处理它。
【解决方案3】:

你描述的方式带来了两个问题。

问题1:在现实网络世界中,您可以找到许多配置文件接收器可以直接连接两个文件发送器。您需要进行很多配置才能授予访问权限。

问题 2:您使用该设计使您的代码变得复杂。文件发送者需要实现一个客户端和一个服务器套接字。

IMO 更好的方法是文件发送方将所需文件传递到管理服务器。如果文件接收者想要文件,他只需从服务器下载。

【讨论】:

  • 您描述的解决方案与ja_mesa所说的相同。但是如果文件发送者经常传输大文件,它会让服务器端负载很大
  • @Mrrain 如果管理服务器上的负载过高,您可以使用第二个文件服务器。我们谈论的文件大小是多少?
  • 这是一个很好的解决方案,感谢您的帮助。我认为它必须在网络上有开源的分布式文件传输服务器。
猜你喜欢
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多