当前位置: 首页 > 知识库问答 >
问题:

Java:服务器/客户端->客户端/客户端

夏宏旷
2023-03-14

我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下:

我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。

换句话说:每个客户端都有一个ServerSocket,所有其他客户端都连接到它。消息应该通过图像中的蓝线传递。

我只遇到了一个小问题:如果我通过所有不同的IP地址进行测试,它可以正常工作,但是当两个客户端拥有相同的(外部)IP地址时,它就不再工作了。有人知道一个聪明的解决方案吗?

谢谢马克

共有2个答案

白腾
2023-03-14

如果您尝试通过Internet使其工作,您应该查看STUN。我不知道是否有任何可用的“即用型”库,但这篇文章应该可以让您开始使用。

欧阳骏俊
2023-03-14

当主机位于NAT路由器后面,并且想要打开一个应该可以从NAT另一端访问的服务器端口时,NAT路由器必须配置为将该端口上的所有输入连接转发到此主机。

显然,NAT路由器不能被配置为对监听同一端口的两个不同主机执行此操作。它不知道应该由哪个主机来处理每个输入连接。当NAT后面有两台服务器时,它们必须使用不同的端口,并且NAT路由器必须配置为将每个端口转发到每个服务器。

这是对等网络的一个已知问题。其结果是,只有当至少一个NAT配置为端口转发,从而可以充当另一个NAT的服务器时,两个NAT后面的客户端之间才可能直接连接。

解决方案:

连接锁定在非转发NAT后面的两个客户端的解决方法是添加使用第三个客户端的能力,该客户端具有服务器功能,作为它们之间的中间人。

当两个客户端位于同一个NAT后面时,它们可以通过中央服务器交换LAN IP,并使用这些IP相互连接。

 类似资料:
  • 前面的章节介绍了所有 Redis 的重要功能组件: 数据结构、数据类型、事务、Lua 环境、事件处理、数据库、持久化, 等等, 但是我们还没有对 Redis 服务器本身做任何介绍。 不过, 服务器本身并没有多少需要介绍的新东西, 因为服务器除了维持服务器状态之外, 最重要的就是将前面介绍过的各个功能模块组合起来, 而这些功能模块在前面的章节里已经介绍过了, 所以本章将焦点放在服务器的初始化过程,

  • 问题内容: 我有stfw,但是找不到在Java中创建Web服务客户端的简单/独立方法。 有人在此链接/示例吗? 问题答案: 使用Axis2怎么样? 只需按照快速入门指南进行操作,就可以轻松应对。 这是另一个更具描述性的指南

  • 问题内容: 我正在尝试在Java中的服务器和JavaScript客户端之间建立连接,但在客户端出现此错误: WebSocket与“ ws://127.0.0.1:4444 /”的连接失败:在收到握手响应之前,连接已关闭 由于可能从未调用该函数,因此它可能保持在OPENNING状态。该不会被调用。 有人可以让我知道这里出了什么问题吗? 服务器 服务器线程 游戏协议 客户 问题答案: 首先,您的两个代

  • 问题内容: 我尝试使用以下代码从服务器到客户端发送文件和目录列表。服务器正在从客户端接收消息,但我不知道服务器是否没有发送回结果或客户端是否不接受结果。 服务器端: 问题答案: 据我所见,您在客户端上做的同时在服务器上做。从服务器发送的字符串中没有行尾字符,因此客户端将永远无法完成。执行outqw.println()或添加到要发送的内容的末尾。话虽这么说,很难用一堆注释掉的东西来浏览未格式化的代码

  • 我正在尝试重建一个与elasticsearch 2.4对话的插件,以便与elasticsearch 5配合使用。 代码来自:https://github.com/pentaho/pentaho-kettle/blob/master/plugins/elasticsearch-bulk-insert/src/org/pentaho/di/trans/steps/elasticsearchbulk/E

  • 我有一个包含10个微服务的微服务架构,每个微服务提供一个客户端。在由微服务团队管理/控制的客户机内部,我们只接收参数并将它们传递给一个通用http调用程序,该调用程序接收endpoint和N个params,然后进行调用。所有微服务都使用http和web api(我猜技术并不重要)。 对于我来说,作为微服务团队提供一个客户是没有意义的,应该是消费者的责任,如果他们想创建一些抽象或者直接调用它是他们的