我有使用Socket
与服务器通信的Android客户端应用。
在我的开发机器上,SocketServer
(服务器也是用Java编写的)正在127.0.1.1
端口8666
进行侦听。我还在Android应用的应用清单中添加了互联网访问权限。
但是当我尝试使用client = new Socket("127.0.1.1",8666)
实例化Socket对象时,它会抛出IOException
connection refused
消息(也尝试使用localhost
而不是手动提供IP地址,但它不起作用)。虽然我可以从简单的控制台Java程序轻松连接到服务器。
这里可能有什么问题?
我的问题在某些方面与this有关。我试图访问在运行模拟器的机器中运行的服务器。
注意:我知道不建议在任何Activity类中执行网络IO,我也不是这样做的,上面的代码只是一个简化的问题需要理解。
答案 0 :(得分:2)
尝试使用端口转发
从adb位置的命令提示符
adb forward tcp:8666 tcp:8666
转发命令用于设置任意端口转发 - 将特定主机端口上的请求转发到仿真器/设备实例上的其他端口。以下是如何设置主机端口8666到仿真器/设备端口8666的转发:
如果这没有帮助,那么发布你的代码和logcat错误。
答案 1 :(得分:0)
您的Android代码是通过WiFi在模拟器中运行还是在真实硬件上运行?如果您在模拟器中运行,则开发计算机的IP地址可能为10.0.2.2(请参阅Android Developer Tools: Emulator)。
如果您的应用在通过WiFi连接的Android手机上运行,则必须指定机器的IP地址,而不是环回地址。
另外,当你说你的SocketServer正在侦听127.0.1.1时,你绑定到那个接口吗?如果您期望来自其他接口的连接,则不应绑定到环回。
答案 2 :(得分:0)
如果我做对了:您的套接字服务器在另一台机器上运行。您不能使用127.0.0.1通过Android手机连接到该服务器,因为这是本地环回地址。 找到您机器的IP地址并使用它。
如果在尝试连接到计算机上运行的套接字服务器时在模拟器上使用它,则仍然无法使用127.0.0.1,因为它是模拟器的本地回送地址。