Android连接到tethering插槽

我有2个Android设备,一个充当服务器在共享模式,并接受连接到一个端口。 另一台设备充当连接到服务器热点的客户端,并通过端口build立到服务器的连接。 (一切都没有在中间的路由器完成)。

服务器代码如下所示:(当android服务器执行代码时,设备处于共享模式)

ServerSocket server = new ServerSocket(PORT); while (true) { Socket client; client = server.accept(); ClientThread com = new ClientThread(client, this); Thread t = new Thread(com); t.start(); } 

客户端代码如下所示:(当Android客户端执行此代码时,设备连接到接入点)

 Socket client = new Socket(); int serverIP = wifiManager.getDhcpInfo().serverAddress; String stringIP = android.text.format.Formatter.formatIpAddress(serverIP); InetAddress address = InetAddress.getByName(stringIP); SocketAddress socketAddress = new InetSocketAddress(address, PORT); client.connect(socketAddress); 

我在客户端上得到以下错误

 java.net.ConnectException: failed to connect to /192.168.43.1 (port 12345): connect failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.connect(IoBridge.java:114) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) at java.net.Socket.connect(Socket.java:842) at java.net.Socket.connect(Socket.java:785) at com.alternatewifimeshmessaging.HostManager.clientConnect(HostManager.java:283) at com.alternatewifimeshmessaging.HostManager.client(HostManager.java:189) at com.alternatewifimeshmessaging.HostManager.run(HostManager.java:59) at java.lang.Thread.run(Thread.java:856) Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable) at libcore.io.Posix.connect(Native Method) at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) at libcore.io.IoBridge.connectErrno(IoBridge.java:127) at libcore.io.IoBridge.connect(IoBridge.java:112) ... 8 more 

服务器没有提供任何错误。

我在Android清单文件中设置了以下权限:

 <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> 

理想情况下,我需要将一些数据从服务器传输到客户端。

我究竟做错了什么?

通过testing发现,无法在共享设备上build立连接。

但是,如果我们逆转进程并在连接的客户端上打开一个serversocket。 并从networking设备连接到它,它将工作。

所以扭转沟通是答案。

服务器端

 class ServerThread implements Runnable { public void run() { socket = new Socket(); try { serverSocket = new ServerSocket(SERVERPORT); } catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { try { socket = serverSocket.accept(); CommunicationThread commThread = new CommunicationThread(socket); new Thread(commThread).start(); } catch (IOException e) { e.printStackTrace(); } } } } 

客户端

 class ClientThread implements Runnable { @Override public void run() { try { socket = new Socket(); InetSocketAddress socketAddress = new InetSocketAddress(SERVER_IP, SERVERPORT); socket.connect(socketAddress); CommunicationThread commThread = new CommunicationThread(socket); new Thread(commThread).start(); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } 

在连接的无线连接中,连接提供者不能作为客户端工作。 所以我们需要实现一个双向的tcp套接字连接。 在共享模式的设备中使用带有端口号的服务器套接字。 该设备充当服务器。 在客户端设备中使用套接字访问带有IP地址的客户端端口。