2010-08-28 14 views
11

Tôi đang cố gắng nghe trên cổng bằng cách sử dụng ServerSocket trên thiết bị Android. Tôi muốn có thể kết nối với cổng này qua WiFi bằng máy tính trên cùng một mạng.Không thể sử dụng ServerSocket trên Android

tôi nhận được không phải ngoại lệ khi ràng buộc nó vào một cổng, tuy nhiên khi tôi kiểm tra netstat nó nói:

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

Tôi đã thử vô số cách để ràng buộc nó để localhost, 0.0.0.0, WiFi LAN IP địa chỉ của thiết bị có SocketInetAddressInetAddress.getByName. Không có gì có vẻ hiệu quả.

Khi tôi cố gắng để kết nối với cổng từ một máy tính trong cùng mạng WiFi (Tôi đã thử cả netcat và Java Socket.connect()), tất cả những gì có thể thấy trong Wireshark là một yêu cầu ARP:

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

này yêu cầu lặp lại cho đến khi hết thời gian chờ.

Tôi đã thử cách ngược lại, bằng cách đặt ServerSocket trên máy tính và kết nối với cổng đó từ điện thoại, hoạt động rất tốt.

Điện thoại thử nghiệm của tôi là Samsung Spica i5700 có ROM tùy chỉnh.

Bất kỳ ý tưởng nào?

Edit: Mã này là đơn giản như thế này:

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

Bạn có thể hiển thị một số mã không? Bạn có đặt quyền phù hợp trong tệp kê khai không? – Flo

+0

Tôi đã cập nhật câu hỏi với một số mã. Có, tôi đặt quyền INTERNET trong tệp kê khai. – shuwo

+0

'ServerSocket.accept()' không thể trả về null. – EJP

Trả lời

0

tôi đã có thể làm việc này bằng cách sử dụng

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

nơi addr = InetĐịa chỉ điện thoại của bạn. Nếu không, nó chỉ có vẻ liên kết với localhost (127.0.0.1). Ngoài ra, tôi đang sử dụng cổng 8080.

+0

Làm thế nào để bạn tìm ra InetAddress của điện thoại? – JPM

+0

Nếu bạn bỏ qua đối số tên máy chủ hoặc chuyển 'null', nó sẽ liên kết với' 0.0.0.0.' – EJP

0

tôi vật lộn với điều này quá và chỉ có thể kết nối đến máy chủ Android của tôi bằng cách sử dụng:

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

đâu hostname là IP địa phương, mà tôi đã sử dụng Hàm getLocalIpAddress() từ trang này:

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