2013-07-24 14 views
31

私は2つのアンドロイドデバイスを持っています.1つはテザリングモードのサーバとして機能し、ポートへの接続を受け入れます。 他のデバイスは、サーバーのホットスポットに接続し、ポート経由でサーバーへの接続を確立するクライアントとして機能します。 (すべてが途中でルータなしで行われます)。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(); 
} 

クライアントコードは次のようになります(アンドロイドクライアントは、このコードを実行すると、デバイスがアクセスポイント)私は、クライアント上で次のエラーを取得する

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> 

理想的には、私はサーバからクライアントにいくつかのデータを転送する必要があります。

私は間違っていますか?

答えて

14

テストによって、テザリング装置で接続を確立できないことが判明しました。

しかし、プロセスを逆にして、接続されたクライアントでserversocketを開くとします。テザリング装置からそれに接続すれば、それは動作します。

したがって、通信を元に戻すことがその答えです。

+0

どうすればいいですか? –

2

サーバー側

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(); 
      } 
     } 
    } 
} 

クライアント側つながWiFi接続で

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(); 
     } 
    } 
} 
1

、接続プロバイダは、クライアントとして動作することはできません。したがって、双方向のtcpソケット接続を実装する必要があります。テザリングモードにあるデバイスのポート番号を持つサーバーソケットを使用します。このデバイスはサーバーとして動作します。クライアントデバイスでは、ソケットを使用してIPアドレスを持つクライアントポートにアクセスします。

関連する問題