2015-07-27 3 views
4

Я работаю над собственным приложением для Android, Мне нужно подключить мое приложение к серверу Sockjs. Я пытался подключиться к Socket.IO, Autobahn, WebSockets, но не подключался. Есть ли какой-нибудь клиент sockjs для Android? Пожалуйста, помогите, спасибо.Подключить приложение android к серверу sockjs

Socket.IO:

private void connectToSocket(String serverUrl, String accessKey) { 
    IO.Options opts = new IO.Options(); 
    opts.forceNew = true; 
    opts.reconnection = true; 
    //opts.query = "accessKey="+accessKey; 
    String host = serverUrl; 

    try { 
     mSocket = IO.socket(host, opts); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
    } 

    mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError); 
    mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError); 
    mSocket.on(Socket.EVENT_CONNECT, onConnect); 
    mSocket.on("new message", onNewMessage); 
    mSocket.connect().emit("accessKey", accessKey); 
    if (mSocket.connected()) { 
     Log.d("SocketMsg: ", "Connected"); 
    } 

} 

private Emitter.Listener onConnect = new Emitter.Listener() { 

    @Override 
    public void call(final Object... args) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Log.d("SocketMsg: ", args[0].toString()); 
       //mSocket.emit("accessKey", accessKey); 
       Toast.makeText(MainActivity.this.getApplicationContext(), 
         "Connect", Toast.LENGTH_LONG).show(); 
       for (Object o : args) { 
        Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString()); 
       } 
      } 
     }); 
    } 
}; 
private Emitter.Listener onConnectError = new Emitter.Listener() { 
    @Override 
    public void call(final Object... args) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Log.d("SocketMsg: ", args[0].toString()); 
       Toast.makeText(MainActivity.this.getApplicationContext(), 
         "Error", Toast.LENGTH_LONG).show(); 
       for (Object o : args) { 
        Log.i("IO " + Socket.EVENT_CONNECT_ERROR, o.toString()); 
       } 
      } 
     }); 
    } 
}; 

Его даяние 'XHR опрос ошибка'

ответ

6

Теперь успешно подключен к SockJS, используя следующий трюк :).

1. Place a web view and set its visibility to gone. 
2. Use SockJS client in webview. 
3. Create a javascript Interface that send data back to native code when get data from socket. 
4. We have to call the function only once from native code. 

JavaScript Interace:

public class WebAppInterface { 
    Context mContext; 

    /** 
    * Instantiate the interface and set the context 
    */ 
    WebAppInterface(Context c) { 
     mContext = c; 
    } 

    /** 
    * Show a toast from the web page 
    */ 
    @JavascriptInterface 
    public void msg(final String toast) { 
     Log.d("msg: ", toast); 
     if (toast.contains("{")) 
      createMarkerList(toast); 
    } 
} 

SockJS Client на WebView:

<script type="text/javascript"> 
    function connectToSocket(url, accessKey){ 
     Android.msg(String("called")); 
     var sock = new SockJS("http://api.example.in:8182/realtime"); 
     sock.onopen = function() { 
      Android.msg("open"); 
      sock.send(JSON.stringify({ 
       key: accessKey 
      })); 
     }; 

     sock.onclose = function() { 
      Android.msg("close"); 
     }; 

     sock.onmessage = function(e) { 
      result = e.data.replace(/,\s*$/, ''); 
      Android.msg(String(result)); 
     }; 

     sock.onerror = function(e) { 
      Android.msg("error"); 
     }; 
    } 
</script> 

Вызов JS функции:

webView.loadUrl(javascript:connectToSocket(url, accessKey)); 
+0

я также написал клиент для sockJs : https://github.com/vishal-raj/SockJsClientAndroid –

+0

Есть ли способ отправить сообщение на сервер, используя ваш sockjs-клиент в android? –

+0

реализовать функцию sock.send (''). –

0

Я предлагаю вы использовали socket.io.

Там очень хороший образец для клиента и сервера на Socket.io Blog

+0

благодаря @blipinsk – MHossein

Смежные вопросы