Невозможно использовать ServerSocket на Android
Я пытаюсь слушать порт, используя ServerSocket
на устройстве Android. Я хочу иметь возможность подключиться к этому порту через Wi-Fi, используя компьютер в той же сети.
Я не получаю исключения при привязке его к порту, но когда я проверяю 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 LAN address]? Tell [computer LAN address].
Этот запрос повторяется до истечения времени ожидания.
Я пробовал обратный путь, установив ServerSocket на компьютер и подключившись к этому порту с телефона, который работает очень хорошо.
Мой тестовый телефон - Samsung Spica i5700 с пользовательским ROM.
Любые идеи?
Изменить:
Код прост как это:
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
Ответы
Ответ 1
Вместо использования server.bind попробуйте инициализировать серверный сокет следующим образом:
server = new ServerSocket (4040);
Кроме того, server.accept() будет фактически блокироваться до тех пор, пока не будет создано соединение, поэтому вам не нужно, чтобы в цикле while (http://download.oracle.com/javase/1.5.0/docs/api/java/net/ServerSocket.html#accept())
Ответ 2
Мне удалось получить эту работу, используя
ServerSocket server = new ServerSocket( myTcpPort, 0, addr );
где addr = InetAddress вашего телефона. В противном случае он только привязывается к localhost (127.0.0.1). Кроме того, я использую порт 8080.
Ответ 3
Я тоже боролся с этим и смог подключиться только к своему Android-серверу, используя:
ServerSocket myServerSocket = new ServerSocket();
String hostname = getLocalIpAddress();
myServerSocket.bind(new InetSocketAddress(hostname, myPort));
Если имя хоста было локальным IP-адресом, которое я получил с помощью функции getLocalIpAddress() с этой страницы:
https://github.com/Teaonly/android-eye/blob/master/src/teaonly/droideye/MainActivity.java