首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Websocket Android客户端异步接收文本消息[2]

使用Websocket Android客户端异步接收文本消息[2]
EN

Stack Overflow用户
提问于 2014-11-04 19:21:28
回答 1查看 1.8K关注 0票数 0

我尝试从websocket服务器(使用ASP.NET服务器构建)向Android客户端异步接收文本消息。我尝试了几种Android websocket库(autobahn,android-websocket,mobile-websocket,java-websocket,... )但android客户端只有在之前发送消息后才会收到文本消息。我想从服务器(或另一个客户端)接收消息,而不需要在之前发送文本消息。

例如,您是否知道任何解决方案或聊天示例应用程序?

非常感谢!

(这是第二篇文章。第一个是here)

下面是我在autobahn库中使用的代码:

代码语言:javascript
复制
private final WebSocketConnection mConnection = new WebSocketConnection();

private void start() {

   final String wsuri = "ws://localhost:9000";

   try {
      mConnection.connect(wsuri, new WebSocketHandler() {

         @Override
         public void onOpen() {
            mConnection.sendTextMessage("Hello, world!");
         }

         @Override
         public void onTextMessage(String payload) {
            // Here, I received message only if I have used WebSocketConnection.sendTextMessage(String) function
         }

         @Override
         public void onClose(int code, String reason) {

         }
      });
   } catch (WebSocketException e) {

      Log.d(TAG, e.toString());
   }
}
EN

回答 1

Stack Overflow用户

发布于 2016-09-08 17:16:24

我也从两周开始在Android上使用websocket……在我的情况下,我想使用WSS,所以,安全的websockets和自签名证书……在我的所有尝试中,唯一可以无缝工作的库是nv-websocket-client,但这只适用于安全的websocket情况。

无论如何,我把我的代码放在这里,如果你觉得有用,我删除了一些隐私细节,如果你需要一个简单的连接,你可以跳过SSL部分。

代码语言:javascript
复制
    public class SocketHandler
    {
    private final static String LOGTAG = "SocketHandler";
    private int TIMEOUT = 5000;
    private MainActivity main;
    private SocketConnector socketConnector;

    public SocketHandler(MainActivity main) {
        this.main = main;
    }

    public void connect() {
        socketConnector = new SocketConnector();
        socketConnector.execute();
    }

    public void disconnect() {
        socketConnector.ws.disconnect();
    }

    private class SocketConnector extends AsyncTask<Void, Void, Void> {

        WebSocket ws;

        @Override
        protected Void doInBackground(Void... params) {
            try {   
                SSLContext context = NaiveSSLContext.getInstance("TLS");
                WebSocketFactory wsf = new WebSocketFactory();
                wsf.setConnectionTimeout(TIMEOUT);
                wsf.setSSLContext(context);
                ws = wsf.createSocket("wss://" + ADDRESS);
                ws.addListener(new WSListener());
                ws.addExtension(WebSocketExtension.parse(WebSocketExtension.PERMESSAGE_DEFLATE));
                ws.connect();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }       
    }

    private class WSListener extends WebSocketAdapter {

        @Override
        public void onConnected(WebSocket websocket, Map<String, List<String>> headers) {
            websocket.sendText("Hello World");
        }

        @Override
        public void onTextMessage(WebSocket websocket, String message) {

        }

        @Override
        public void onError(WebSocket websocket, WebSocketException cause) {

        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26733878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档