2015-02-06 82 views
1

目标如何访问NAT路由器后面的ServerSocket?

我正在为Android聊天应用程序,我目前有2部电话,其最终必须为几千个用户的工作测试。

问题

我得到一个ConnectionException说:“连接被拒绝”每当2个手机,请尝试通过套接字连接到对方。

当前设计

每部手机开始一个ServerSocket,调用accept()方法等待一些插座来连接,并取其手机先发送一个消息,将创建一个客户端的Socket。我确定我使用的IP地址是正确的(它们实际上都使用相同的外部IP)。 我相信问题是与端口。我随机生成一个端口号,如果它可以自由使用,我说ServerSocket s = new ServerSocket(randomPortNumber)

我觉得是这个问题

我觉得这是什么问题是这个端口号是一个坐在一个NAT路由器后面的来源。所以当一个Socket尝试使用类似Socket socket = new Socket(ip, serverSocketRandomPortNumber)的方式连接到ServerSocket时,它将尝试连接到NAT路由器并为其提供此端口号,这将不起作用,因为路由器本身不在此端口上侦听,而是在后面的电话路由器是。

问题和想法

我的问题是,我该如何处理这个问题?

我必须改变我的设计吗?

如果我必须,我想的一个替代设计是在Web主机上使用单个ServerSocket,并使用它将客户端套接字发送的消息重定向到其他客户端套接字。

我在PHP来实现服务器端沿着这些路线引用了一句: http://php.net/manual/en/sockets.examples.php

而且我仍然会使用Java客户端。

回答

2

由于其中一部电话位于NAT路由器之后,除非在路由器上启用端口转发(或其他一些技术),否则无法启动与其的任何连接。

实现聊天应用程序的常用方式是,所有客户端都会连接到一个通用服务器。

你不必编写自己的聊天服务器(除非你真的想)。我建议使用XMPP协议。已经制作的服务器列表here。在客户端(Android),您可以找到您可以使用的库,here

+0

所以你说的是,由于端口转发并不可行,所以我们应该使用服务器。所以你可以告诉我服务器实际上做了什么。它如何帮助在不同网络中的两个设备之间进行通信。请原谅我,因为我在这里提问。我刚接触网络,无法找到任何资源。 – 2016-03-08 07:48:47