11

我正在尝试ServerSocket在 Android 设备上使用的端口进行监听。我希望能够使用同一网络上的计算机通过 WiFi 连接到此端口。

将它绑定到端口时我没有例外,但是当我检查 netstat 时它说:

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 (null):4040             (null):*                LISTEN

我尝试了无数种方法将其绑定到 localhost、0.0.0.0、设备的 WiFi LAN IP 地址SocketInetAddressInetAddress.getByName. 似乎没有任何效果。

当我尝试从同一 WiFi 中的计算机连接到端口时(我已经尝试过 netcat 和 Java 的Socket.connect()),我在 Wireshark 中看到的只是一个 ARP 请求:

Who has [phone's LAN address]? Tell [computer LAN address].

此请求会不断重复,直到超时。

我尝试了相反的方法,通过在计算机上设置 ServerSocket 并从手机连接到该端口,效果很好。

我的测试手机是带有自定义 ROM 的三星 Spica i5700。

有任何想法吗?

编辑:代码很简单:

ServerSocket server = new ServerSocket();
server.setReuseAddr(true);
server.setTimeout(0);
server.bind(new InetSocketAddress(4040));

Socket client = null;
while((client = server.accept()) == null);
// Connected
enter code here
enter code here
4

3 回答 3

4

不要使用 server.bind,而是尝试像这样初始化服务器套接字: server = new ServerSocket(4040);

此外, server.accept() 实际上会阻塞,直到建立连接,所以你不需要那个 while 循环(参见:http: //download.oracle.com/javase/1.5.0/docs/api/java/ net/ServerSocket.html#accept () )

于 2010-11-02T23:29:27.630 回答
0

我能够通过使用来完成这项工作

 ServerSocket server = new ServerSocket( myTcpPort, 0, addr );

其中 addr = 您手机的 InetAddress。否则,它似乎只绑定到 localhost (127.0.0.1)。另外,我使用的是 8080 端口。

于 2011-08-04T13:33:19.983 回答
0

我也为此苦苦挣扎,只能通过以下方式连接到我的 Android 服务器:

ServerSocket myServerSocket = new ServerSocket();
String hostname = getLocalIpAddress();
myServerSocket.bind(new InetSocketAddress(hostname, myPort));

其中主机名是本地 IP,我使用此页面中的 getLocalIpAddress() 函数获得了该 IP:

https://github.com/Teaonly/android-eye/blob/master/src/teaonly/droideye/MainActivity.java

于 2013-10-16T14:56:18.217 回答