2014-10-21 1 views
5

Я использую эту библиотеку AndroidSync от koush для создания websocket (сервер/клиент) и передачи данных между двумя устройствами Android. Оба устройства подключаются через Wi-Fi (к ним подключается Wifi AP, а к нему подключено другое устройство). Я получаю TimeoutException на клиентском устройстве через 4-5 секунд отправки запроса. Это то, что я сделал до сих пор ..Веб-сайты AndroidAsync не работают

ServerActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_server); 

    mSockets = new ArrayList<WebSocket>(); 
    mAsyncHttpServer = new AsyncHttpServer(); 
    mWebSocketCallback = new AsyncHttpServer.WebSocketRequestCallback() { 
     @Override 
     public void onConnected(final WebSocket webSocket, RequestHeaders headers) { 
      mSockets.add(webSocket); 
      webSocket.send("Welcome Client"); 
      webSocket.setClosedCallback(new CompletedCallback() { 
       @Override 
       public void onCompleted(Exception ex) { 
        try { 
         if (ex != null) 
          Log.e("WebSocket", "Error"); 
        } finally { 
         mSockets.remove(webSocket); 
        } 
       } 
      }); 
      webSocket.setStringCallback(new WebSocket.StringCallback() { 
       @Override 
       public void onStringAvailable(String s) { 
        Log.d("SERVERTAG",s); 
        Toast.makeText(getApplicationContext(),s,Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }; 

    mAsyncHttpServer.websocket("/",mWebSocketCallback); 
    mAsyncHttpServer.listen(Utils.PORT_NUMBER); 

    Button sendButton = (Button) findViewById(R.id.sendButtonS); 
    sendButton.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View view) { 
      for(WebSocket socket : mSockets) { 
       socket.send("Server sent a string"); 
      } 
     } 
    }); 

} 

ClientActivity.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_client); 
    mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 

    //Resolve IP address 
    int ipAddress = mWifiManager.getConnectionInfo().getIpAddress(); 
    String hostAddress = Formatter.formatIpAddress(ipAddress); 
    hostAddress = "http://" + hostAddress + ":" +Utils.PORT_NUMBER; 
    Log.d("CLIENTTAG", "address is " + hostAddress); 

    mWebSocketConnectCallback = new AsyncHttpClient.WebSocketConnectCallback() { 
     @Override 
     public void onCompleted(Exception ex, WebSocket webSocket) { 
      if (ex != null) { 
       ex.printStackTrace(); 
       return; 
      } 
      webSocket.send("Hello Server"); 
      webSocket.setStringCallback(new WebSocket.StringCallback() { 
       @Override 
       public void onStringAvailable(String s) { 
        Log.d("CLIENTTAG",s); 
        Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }; 
    mAsyncHttpClient = AsyncHttpClient.getDefaultInstance(); 
    mAsyncHttpClient.websocket(hostAddress, null, mWebSocketConnectCallback); 

} 

Это то, что я получаю в LogCat в клиентском устройстве.

10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ java.util.concurrent.TimeoutException 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.http.AsyncHttpClient$2.run(AsyncHttpClient.java:240) 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.AsyncServer.lockAndRunQueue(AsyncServer.java:683) 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.AsyncServer.runLoop(AsyncServer.java:700) 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:608) 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.AsyncServer.access$700(AsyncServer.java:37) 
10-21 19:50:49.289  742-945/com.haloappstudio.musichub W/System.err﹕ at com.koushikdutta.async.AsyncServer$13.run(AsyncServer.java:557) 

Я до сих пор не выполнял программирование сокетов. Может ли кто-нибудь помочь мне здесь?

Любая помощь приветствуется.

ответ

1

Я нашел проблему, поскольку @jrandaz сказал, что проблема связана с IP-адресом сервера.

Оказывается собственный IP-адрес

WifiManager.getConnectionInfo().getIpAddress()

устройство возвращается не адрес Wi-Fi точки доступа устройства, к которому он подключен. Я использовал 192.168.43.1, который по умолчанию является IP-адресом Wi-Fi-точки доступа в android, и это сработало.

0

На стороне клиента вы пробовали передать http, в котором у вас есть нуль?

mAsyncHttpClient.websocket(hostAddress, null, mWebSocketConnectCallback);

Возможно попробовать

mAsyncHttpClient.websocket(hostAddress, http, mWebSocketConnectCallback);

Кроме того, когда вы обращаетесь к обоим из устройств, подключенных к Wi-Fi, то, что вы имеете в виду с помощью второго устройства "Подключено к нему. (Прояснит это через комментарий, но не имеет достаточного количества баллов). Возможно, вы не получаете правильный IP-адрес при подключении к демонстрационному серверу.

+0

Я имею в виду, что второе устройство подключено к Wi-Fi-точке первого устройства. – suheb