我正在为Android制作聊天应用程序,目前正在测试2个模拟器和通过usb连接的手机 . 在过去的24小时里,我无法让Socket连接到ServerSocket . 每个主机都使用ServerSocket,以便通过其客户端套接字监听其他主机“通话” .
对于这两个模拟器,打印出以下两行代码: 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就像模拟器一样,除了它还说“Connection refused” .
当从模拟器向手机发送消息时,由于超时,我得到一个ConnectionException .
手机的ServerSocket正在使用ip 0.0.0.0,我知道这很好,因为这意味着它只是在监听所有接口 .
在所有情况下,Server Socket的accept()方法永远不会返回 .
使用 netstat -an
(我使用Windows作为我的操作系统),我没有看到我的ServerSockets在输出中列出的任何端口 .
使用telnet,我在模拟器上尝试时会收到连接被拒绝消息(使用php的 $_SERVER['REMOTE_ADDR']
来获取ip) .
当我在手机的IP和监听端口上使用telnet时,我得到连接超时 .
那就是说,请帮我弄清楚如何连接这些插座 .
1 回答
简单的答案就是我试图做的事情是当我真的要把NAT分配给主机's internal port when a message was sent out. Here' sa图片来描述我说的话时(取自讲座)加州大学圣地亚哥分校令人敬畏的网络教授Alex C. Snoeren的幻灯片:
我的解决方案是通过让一个ServerSocket一直监听某些webhost上的新连接来重新设计我正在做的事情 .