【问题标题】:Need suggestions for android socket programming需要android socket编程的建议
【发布时间】:2012-05-10 19:28:42
【问题描述】:

我们正在开发一款通过 wifi 发送和接收短信的安卓应用。 我们使用 TCP 套接字进行此通信(IP 地址和随机端口),但问题是如果我不允许路由器的“端口转发部分”中的这些端口号,则无法发送消息。 有什么办法可以解决这个问题吗?

【问题讨论】:

  • 嗯,你总是可以启动一个免费的 EC2 服务器。
  • 为什么不直接选择一个端口,或者一些可预测的算法来选择端口并且可以在双方复制?
  • 即使我们选择一个端口号并尝试连接它,我们仍然需要从路由器进行端口转发。

标签: java android sockets port


【解决方案1】:

您可以从选定范围内随机选择端口并在路由器中转发该范围,如下所示:

int 端口 = (Math.abs(random.nextInt())) % 3000 + 1024;

这样我就生成了一个介于 1024 和 2999 之间的随机数。或者只是选择一个固定端口。

【讨论】:

  • 这正是我们所做的。问题是路由器不允许通信,除非我们允许它使用该特定端口。
  • 那我会说你的路由器有问题。因为这是我迄今为止使用的。
  • 这是我不明白的:当我们尝试使用我们的应用程序发送消息时,我们需要允许来自路由器的端口。当我们尝试使用随机端口使用任何 torrent 客户端下载内容时,没有问题。这两个应用程序都是 p2p。如何下载文件,但无法发送/接收消息?
  • 我可能弄错了,但也许您的 p2p 软件使用了已知端口。
【解决方案2】:

如果两个客户端都在不同的限制性防火墙后面,您应该研究打洞,其中两个客户端都打开与第三个服务器的连接,然后第三个服务器预测在 NAT 上打开的端口:NAT traversal with Javahttps://stackoverflow.com/questions/917385/nat-traversal-with-java/。请注意,正如您在此处描述的那样,这通常是 P2P 应用程序(即客户端到客户端)所需要的。是的,它非常复杂和讨厌:(

您最好使用 Amazon Cloud Services 之类的东西将消息存储在云中,并使用基于推送的机制来通知对方收到消息,也许使用长轮询 HTTP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多