2014-10-21 16 views
5

Ich bin mit dieser AndroidSync Bibliothek von Koush zu websocket (Server/Client) und Übertragen von Daten zwischen zwei Android-Geräten zu erstellen. Die beiden Geräte sind über WLAN verbunden (eines davon ist Wifi AP und anderes ist damit verbunden). Ich bekomme TimeoutException in Client-Gerät nach 4-5 Sekunden des Sendens der Anfrage. Das ist, was ich bisher ..AndroidAsync WebSockets arbeitet nicht

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

} 

Dies ist, was ich in logcat bekommen in Client-Gerät gemacht haben.

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) 

Ich habe nicht wirklich Socket-Programmierung vor. Kann mir bitte jemand hier helfen?

Jede Hilfe wird geschätzt.

Antwort

1

fand ich die Frage, wie @jrandaz sagte, das Problem mit dem IP-Adresse des Servers ist.

Turns

WifiManager.getConnectionInfo().getIpAddress()

kehrt Gerät die eigene IP-Adresse aus nicht die Adresse des WiFi-Hotspot Gerät, an das es angeschlossen ist. I verwendet 192.168.43.1, die die Standard-IP-Adresse ist der WiFi-Hotspot in Android und es funktionierte.

0

Auf der Client-Seite, haben Sie versucht, vorbei http in dem Sie auf null haben?

mAsyncHttpClient.websocket(hostAddress, null, mWebSocketConnectCallback);

Vielleicht

mAsyncHttpClient.websocket(hostAddress, http, mWebSocketConnectCallback);

Versuchen Sie auch, wenn Sie beide Geräte mit Wireless LAN beziehen, was Sie von der zweiten Einrichtung bedeuten kann ‚mit ihm verbunden‘ ist. (Wäre dies über Kommentar klären, aber nicht genug Punkte) Es ist möglich, dass Sie nicht die richtige IP-Adresse erhalten, wenn Server Demo anschließen.

+0

I bedeuten, die zweite Einrichtung zum WLAN Hotspot der ersten Einrichtung verbunden ist. – suheb