Не могу использовать ServerSocket на Android - PullRequest
11 голосов
/ 28 августа 2010

Я пытаюсь прослушивать порт с помощью 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, IP-адресу WiFi LAN устройства с SocketInetAddress и InetAddress.getByName. Кажется, ничего не работает.

Когда я пытаюсь подключиться к порту с компьютера в том же WiFi (я пробовал и netcat, и Java Socket.connect()), все, что я вижу в Wireshark, это запрос ARP:

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

Этот запрос повторяется до истечения времени ожидания.

Я пробовал обратный путь, установив ServerSocket на компьютере и подключившись к этому порту с телефона, это работает очень хорошо.

Мой тестовый телефон - Samsung Spica i5700 с пользовательским ПЗУ.

Есть идеи?

Edit: Код прост как это:

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

Ответы [ 3 ]

4 голосов
/ 03 ноября 2010

Вместо использования server.bind, попробуйте инициализировать сокет сервера следующим образом: сервер = новый ServerSocket (4040);

Кроме того, server.accept () будет фактически блокироваться до тех пор, пока не будет установлено соединение, поэтому вам не нужно это в цикле while (см .: http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html#accept())

0 голосов
/ 16 октября 2013

Я тоже боролся с этим и смог подключиться к своему Android-серверу только с помощью:

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

Где hostname - это локальный IP-адрес, который я получил с помощью функции getLocalIpAddress () со страницы:

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

0 голосов
/ 04 августа 2011

Я смог заставить это работать с помощью

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

, где адрес = InetAddress вашего телефона.В противном случае он только кажется привязанным к localhost (127.0.0.1).Также я использую порт 8080.

...