SocketTimeoutExceptions的来源

时间:2012-09-28 05:40:05

标签: java android

很抱歉,如果我已经在某个地方发布了这个/我正在寻找的日子。

问题:

通过与Android设备通过对等网络进行通信时,我收到了SocketTimeoutExceptions。

详细信息:

当这种情况发生时,Android设备使用他们自己的移动网络而不是wifi(无论如何,wifi不能用于此)。

Android设备从whatismyip.com成功获取了他们的ipAddress。

一台设备将通过除我们正在使用的对等网络之外的其他方式向另一台设备发送其IP地址。

远程设备的IP地址将成功传送到本地设备。

当本地设备通过对等网络响应时,会发生TimeoutException。

我尝试了什么:

将超时延长到相当长的时间。

使用其他Android设备。

值得注意的:

应该注意的是,这个相同的点对点网络已经过测试,可以在局域网中成功地在PC(运行Linux和windows,如果这很重要)中工作。此外,我们还通过PC上的有线互联网连接测试了对等网络,这绝对有效。

我猜:

我认为设备被isp以某种方式隐藏了,我将不得不编写一些代码来执行与nat遍历类似的操作,但我不太确定。但是,如果设备被隐藏,我应该再次获得连接拒绝。

非常感谢任何帮助。

P.S。我现在无法发布代码,即使我可以在整个过程中使用几千行代码。

3 个答案:

答案 0 :(得分:2)

首先,我与点对点的体验只与wifi连接有关,但我相信一些概念也适用于3G。

如果您收到连接拒绝错误,则表示您的网络数据包已经能够到达其他设备,但设备拒绝接受连接请求,并且否定答案到达您的设备。

如果您收到连接超时错误,则表示您的网络数据包无法访问其他设备,或者其他设备的回答未达到您的设置。

现在让我们对第二个错误(连接超时)感到焦虑:

调试它的第一步是启动设备等待连接,然后从具有网络访问权限的Windows或Linux机器发出命令:

  

telnet deviceIp portWaitingForConnection

如果您收到telnet屏幕并且没有超时错误,则表示问题出现在发送请求连接的代码中。

如果您还收到超时错误,则表明您的网络数据包无法访问设备(或答案无法与您联系)

现在,什么可能阻止网络数据包到达设备。设备可能位于路由器或防火墙后面。

如果设备位于防火墙后面,则需要打开防火墙端口以进行连接。

如果设备位于路由器后面(我认为是这种情况,其他你不需要从whatismyip.com获取IP地址),则需要配置路由器以允许重定向侦听端口上的传入请求到本地设备的IP地址。

没有相关代码,我无法帮助更多。

祝你好运。

答案 1 :(得分:2)

听起来你有自然问题。以下是一些解决问题的起点(但我认为你必须切换到udp):

你当然也可以介绍一个服务器。快乐的黑客:-)

答案 2 :(得分:1)

你应该尝试的是有效地调试你的连接,你可以做的第一件事是在android dev中检查isReachable,即使不幸的是有些网络阻止了ICMP。

另一个需要注意的重要事项是即使你使用3g,你的网络仍然可以使用NAT地址,而且相信我很常见,所以你在whatsmyip上看到的ip也可能是一个NAT的ip。

下一步我建议尝试在混合模式下使用你的应用程序,即一台PC和一台Android设备并尝试连接到PC(确保一个有公共IP或至少转发端口)如果工作你知道它确实是你的移动运营商。

如果确实如此,除了使用wifi或使用本地服务器在两个对等体之间建立连接之外,没有什么可以做的。

另外要注意的是,p2p网络随着它们的增长越来越强大,你也可以实现已经连接到网络并且可以从外部访问的对等体帮助其他人连接到其他对等体。你应该查找p2p中继和Hole punching