2010-08-28 2 views
11

Я пытаюсь слушать порт, используя ServerSocket на устройстве Android. Я хочу иметь возможность подключиться к этому порту через Wi-Fi, используя компьютер в той же сети.Невозможно использовать ServerSocket на Android

я не получаю исключение при выполнении привязки к порту, однако, когда я проверяю NETSTAT он говорит:

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

Я пробовал множество способов связывания его на локальный, 0.0.0.0, LAN IP WiFi адрес устройства с SocketInetAddress и InetAddress.getByName. Ничто не работает.

При попытке подключения к порту с компьютера в той же Wi-Fi (я пробовал как Netcat и в Java Socket.connect()), все, что я могу видеть в Wireshark является запрос ARP:

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

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

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

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

Любые идеи?

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 
+0

Можете ли вы показать код? Вы устанавливаете правильное разрешение в файле манифеста? – Flo

+0

Я обновил вопрос с помощью некоторого кода. Да, я разрешил ИНТЕРНЕТ в манифесте. – shuwo

+0

'ServerSocket.accept()' не может вернуть значение null. – EJP

ответ

4

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

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

0

Я был в состоянии получить эту работу, используя

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

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

+0

Как вы узнали InetAddress своего телефона? – JPM

+0

Если вы опускаете аргумент hostname или передаете 'null', он должен привязываться к' 0.0.0.0.' – EJP

0

Я боролся с этим тоже, и только был в состоянии подключиться к 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