2014-10-21 20 views
5

Tôi đang sử dụng thư viện AndroidSync này bởi koush để tạo websocket (máy chủ/ứng dụng khách) và truyền dữ liệu giữa hai thiết bị Android. Hai thiết bị được kết nối thông qua wifi (một là Wifi AP và khác được kết nối với nó). Tôi nhận được TimeoutException trong thiết bị khách sau 4-5 giây gửi yêu cầu. Đây là những gì tôi đã làm cho đến nay ..Ổ cắm web AndroidAsync không hoạt động

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

} 

Đây là những gì tôi nhận được trong logcat trong thiết bị của khách hàng.

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) 

Tôi chưa thực sự lập trình socket trước đây. Bất cứ ai có thể vui lòng giúp tôi ra khỏi đây?

Mọi trợ giúp đều được đánh giá cao.

Trả lời

1

Tôi đã tìm thấy sự cố, vì @jrandaz cho biết sự cố xảy ra với địa chỉ IP của máy chủ.

Hóa ra địa chỉ IP riêng

WifiManager.getConnectionInfo().getIpAddress()

lợi nhuận của thiết bị không phải là địa chỉ của thiết bị wifi hotspot mà nó được kết nối. Tôi đã sử dụng 192.168.43.1 là địa chỉ IP mặc định của điểm phát sóng wifi trong android và đã hoạt động.

0

Về phía khách hàng, bạn đã thử vượt qua http ở nơi bạn có null chưa?

mAsyncHttpClient.websocket(hostAddress, null, mWebSocketConnectCallback);

Có lẽ thử

mAsyncHttpClient.websocket(hostAddress, http, mWebSocketConnectCallback);

Ngoài ra, khi bạn đề cập đến cả hai thiết bị kết nối với Wifi, điều gì làm bạn có ý nghĩa bởi các thiết bị thứ hai là 'kết nối với nó. (Sẽ làm rõ điều này thông qua bình luận nhưng không có đủ điểm) Có thể bạn không nhận được địa chỉ IP chính xác khi kết nối với máy chủ demo.

+0

Tôi có nghĩa là thiết bị thứ hai được kết nối với điểm phát sóng wifi của thiết bị đầu tiên. – suheb

Các vấn đề liên quan