我想用套接字连接两个Android模拟器(都在同一主机上运行(。
我在其中一个服务器上运行了一台服务器,并侦听外部 IP 地址上的 7000 端口:
InetAddress addr = InetAddress.getByName("10.0.2.15");
ServerSocket serverSocket = new ServerSocket(7000, 50, addr);
try {
sock = serverSocket.accept();
} finally {
serverSocket.close();
}
以及连接到该端口的同一主机上不同模拟器上的客户端:
socket = new Socket();
socket.bind(new InetSocketAddress("10.0.2.15", 6666));
socket.connect(new InetSocketAddress("10.0.2.2", 7000));
我已将客户端绑定到 6666 端口,以便我可以进行必要的 adb 端口转发:
(host) .adb.exe forward --list
emulator-5554 tcp:7000 tcp:7000
emulator-5556 tcp:6666 tcp:6666
我可以通过调试器看到客户端套接字处于"已连接"状态,但调用:
dataInputStream = new DataInputStream(socket.getInputStream());
dataInputStream.available(); // this throws IOException Broken Pipe
抛出一个断管的IOException。
有什么想法问题出在哪里吗?
使用redir而不是adb forward似乎可以解决这个问题。
在服务器模拟器上
telnet locahost 5554
redir add tcp:7000:7000
在客户端模拟器上
telnet localhost 5556
redir add tcp:6666:6666
我真的不明白为什么会有区别,正如文档所述:
">Android 调试桥 (adb( 工具提供端口转发,这是您设置网络重定向的另一种方式。