2012-04-18 67 views
4

我試圖作爲Android客戶端的WebSocket使用 - weberknecht具有螺紋的每一個第二信息發送到的WebSocket的NodeJS(JS):Node WebSocket ServerAndroid與websocket通信(Node Websocket服務器和Android Java客戶端)。在Android這麼想的工作4

它很好地工作於機器人2或2.3 .3,但是當我在android 4上我在websocket.connect()上得到一個錯誤;

你知道我爲什麼或我做錯了什麼嗎?

我的代碼是:

public class MainThread extends Thread { 

    private boolean is_running; 
    private URI url = null; 
    private de.roderick.weberknecht.WebSocket websocket = null; 

    public MainThread() { 
     this.is_running = false; 
     try { 
      url = new URI("ws://192.168.1.88:8088/"); 
      websocket = new WebSocketConnection(url); 

      websocket.setEventHandler(new WebSocketEventHandler() { 
       public void onOpen(){ 
        System.out.println("--open"); 
       } 
       public void onMessage(WebSocketMessage message){ 
        System.out.println("--received message: " + message.getText()); 
       } 
       public void onClose(){ 
        System.out.println("--close"); 
       } 
      }); 
     } catch (WebSocketException wse) { 
      wse.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (URISyntaxException use) { 
      use.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 

    } 
    @Override 
    public void run() { 
     while(is_running){ 
      try { 
       websocket.send("hello world"); 
       Thread.sleep(10000); 
      } 
      catch (WebSocketException wse) { 
       wse.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

    public void set_running(boolean is_running) { 
     if(is_running == true) 
      try { 
       websocket.connect(); 
       this.is_running = is_running; 
      } catch (WebSocketException e) { 
       System.out.println(e.toString()); 
       //e.printStackTrace(); 
      } 
    } 
} 

和我得到的Android 4.0的錯誤:

ERROR/AndroidRuntime(562): FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.biskis.test.websocket/com.biskis.test.websocket.GameActivity}: android.os.NetworkOnMainThreadException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
     at android.app.ActivityThread.access$600(ActivityThread.java:123) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4424) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
     at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
     at libcore.io.IoBridge.connect(IoBridge.java:112) 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
     at java.net.Socket.startupSocket(Socket.java:566) 
     at java.net.Socket.tryAllAddresses(Socket.java:127) 
     at java.net.Socket.<init>(Socket.java:177) 
     at java.net.Socket.<init>(Socket.java:149) 
     at de.roderick.weberknecht.WebSocketConnection.createSocket(WebSocketConnection.java:238) 
     at de.roderick.weberknecht.WebSocketConnection.connect(WebSocketConnection.java:83) 
     at com.biskis.test.websocket.MainThread.set_running(MainThread.java:76) 
     at com.biskis.test.websocket.GameActivity.onCreate(GameActivity.java:20) 
     at android.app.Activity.performCreate(Activity.java:4465) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
     ... 11 more 

或者你知道如何以更好的方式來comunicate客戶端實現這個(Java中, android)到服務器(nodejs,websocket)?

謝謝。

+0

你使用異步任務在單獨的線程中運行了嗎?如何調用這些事件,每次從服務器收到消息時都會調用onMessage?異步任務的onPostExecute回調會發生什麼情況?請回復。 – SHANK 2013-09-27 09:37:12

回答

7

不要連接到主線程上的WebSocket(即在GameActivity.onCreate),錯誤將消失。您可以使用AsyncTask在後臺連接到WebSocket。

通過I/O操作(和網絡訪問最終是一種I/O操作)阻塞主線程將導致(在最壞的情況下)呆滯的用戶界面或Android查殺應用程序,因爲它沒有及時響應。請參閱designing for responsiveness文檔。

+0

感謝您的快速回答。這是問題:D – 2012-04-18 16:14:32

+0

你是否在一個單獨的線程中使用Async Task運行它?如何調用這些事件,每次從服務器收到消息時都會調用onMessage?異步任務的onPostExecute回調會發生什麼情況?請回復。 – SHANK 2013-09-27 09:37:54

相關問題