java android websocket socket.io androidasync-koush

java - AndroidAsync websockets no funciona



socket.io androidasync-koush (2)

Estoy usando esta biblioteca AndroidSync por koush para crear websocket (servidor / cliente) y transferir datos entre dos dispositivos Android. Los dos dispositivos están conectados a través de wifi (uno es WiFi AP y el otro está conectado a él). Recibo TimeoutException en el dispositivo cliente después de 4-5 segundos de enviar la solicitud. Esto es lo que he hecho hasta ahora ...

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

Esto es lo que obtengo en logcat en el dispositivo cliente.

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)

Realmente no he hecho la programación de socket antes. ¿Puede alguien ayudarme aquí?

Cualquier ayuda es apreciada.


En el lado del cliente, ¿ha intentado pasar http en donde tiene nulo?

mAsyncHttpClient.websocket(hostAddress, null, mWebSocketConnectCallback);

Tal vez intente

mAsyncHttpClient.websocket(hostAddress, http, mWebSocketConnectCallback);

Además, cuando se refiere a ambos dispositivos conectados a Wifi, ¿qué quiere decir con el segundo dispositivo está "Conectado a él". (Lo aclararía a través de un comentario pero no tiene suficientes puntos). Es posible que no esté recibiendo la dirección IP correcta cuando se conecta al servidor de demostración.


Encontré el problema, ya que @jrandaz dijo que el problema era con la dirección IP del servidor.

Resulta que

WifiManager.getConnectionInfo().getIpAddress()

devuelve la dirección IP propia del dispositivo, no la dirección del dispositivo de punto de acceso wifi al que está conectado. 192.168.43.1 que es la dirección IP predeterminada del punto de acceso wifi en Android y funcionó.