【发布时间】:2015-02-06 09:12:28
【问题描述】:
我正在为 android 制作一个聊天应用程序,目前正在使用 2 个模拟器和一部通过 USB 连接的手机进行测试。 在过去的 24 小时内,我几乎无法获得连接到 ServerSocket 的 Socket。每个主机都使用一个 ServerSocket,以便通过它们的客户端 Socket 监听其他主机的“对话”。
对于这两个模拟器,打印出以下 2 行代码:
The server socket is using ip: /::
serverSocket = new ServerSocket(portNo);
Log.i("MY_TAG", "The server socket is using ip: " + serverSocket.getInetAddress() );
使用以下代码行,我得到一个 ConnectionException 说它无法连接到指定的 ip 和端口并且连接超时:
socket = new Socket(addr, portNo);
我获取 ip 的方式是大约每 20 秒查询一次服务器,在 php 脚本中,我使用$_SERVER['REMOTE_ADDR'],它确实返回了我的 ip 地址。
当使用手机向模拟器发送消息时,我得到一个稍微不同的错误。我得到了一个 ConnectionException 就像使用模拟器一样,除了它还说“连接被拒绝”。
从模拟器向手机发送消息时,由于超时,我收到了 ConnectionException。
手机的 ServerSocket 正在使用 ip 0.0.0.0,我知道这很好,因为这意味着它只是在侦听所有接口。
在所有情况下,服务器套接字的 accept() 方法永远不会返回。
使用 netstat -an(我使用 Windows 作为我的操作系统),我没有看到输出中列出的我的 ServerSockets 应该侦听的任何端口。
使用 telnet,我在模拟器上尝试时收到连接被拒绝消息(使用 php 的 $_SERVER['REMOTE_ADDR'] 获取 ip)。
在手机的 ip 和侦听端口上使用 telnet 时,我得到连接超时。
也就是说,请帮我弄清楚如何连接这些套接字。
【问题讨论】:
-
您的网络服务正在运行吗?
-
是的。我可以看到我的数据库中每个用户的 IP 地址和端口都得到了更新。大约每 20 秒,一个用户用他们的 ip 和端口更新这个数据库,同时检索他们所有朋友的 ip 和端口。
-
Each host is using a ServerSocket in order to listen to other hosts "talk" via their client Sockets.。对不起,我不明白你的设置。什么是'主机'。使用多个 serversocket 对我来说是个坏主意。你为什么需要那个?重新思考您的设计。 -
在这种情况下,主机是安卓手机或平板电脑。假设我有 2 部手机。两部手机都创建了自己的 ServerSocket。无论哪个先向另一部手机发送消息,都会创建一个普通的 Socket(这是一个客户端套接字),它连接到对方的 ServerSocket。 ServerSocket 接受返回一个代表 tcp 连接和 bam 的套接字,现在它们可以相互通信(无论如何它们应该能够)。设计很简单。
标签: java php android sockets serversocket