代码之家  ›  专栏  ›  技术社区  ›  Apple Appala

建议我从websocket服务器检索实时数据[已关闭]

  •  8
  • Apple Appala  · 技术社区  · 7 年前

    我目前正在从事一个基于GPS的项目,我目前正在使用volley从web接收数据,但最近他们计划用实时数据升级服务。因此,web开发人员已经使用websocket对服务器进行了编程,他们说,对于浏览器应用程序,他们正在使用stomp。用于从服务器检索数据的js协议。他们要求我使用any从他们的服务器检索数据(实时数据),但我不知道从websocket获取实时数据的最佳方法是什么。我从github找到了一个例子 https://github.com/NaikSoftware/StompProtocolAndroid 但这对我来说还不够,在互联网上使用stomp的文档也不够。我希望android能有更好的实现。

    如果您有任何帮助和建议,我们将不胜感激。请不要提及我的firebase,因为我已经提到了firebase,他们拒绝使用它。请大家帮助我,建议我或给我一个很好的例子,简单地使用截击从websocket服务器检索数据。。

    2 回复  |  直到 7 年前
        1
  •  7
  •   Vinayak B    7 年前

    我的回答是基于这个问题中的评论。关于这个问题没有足够的信息,所以我为你的问题写了2个解决方案

    解决方案1-不使用Stomp实现-简单websocket

    这是一个简单的Websocket实现。为此,您可以使用 koush/AndroidAsync 图书馆

    将此项目实施到您的项目中

        dependencies {
        compile 'com.koushikdutta.async:androidasync:2.+'
    }
    

    然后连接到Websocket服务器

     String url="ws://172.17.1.54:8000/";
        AsyncHttpClient.getDefaultInstance().websocket(url, "my-protocol", new WebSocketConnectCallback() {
            @Override
            public void onCompleted(Exception ex, WebSocket webSocket) {
                if (ex != null) {
                    ex.printStackTrace();
                    return;
                }
    
                webSocket.setStringCallback(new StringCallback() {
                    public void onStringAvailable(String s) {
                        System.out.println("I got a string: " + s);
                    }
                });
                webSocket.setDataCallback(new DataCallback() {
                    public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {
                        System.out.println("I got some bytes!");
                        // note that this data has been read
                        byteBufferList.recycle();
                    }
                });
            }
        });
    

    此处设置字符串回调()&setDataCallback()将接收您的实时更新。

    您还可以使用 codebutler/android-websockets 用于此的库。

    解决方案2:使用Stomp实现

    为此,您可以使用 Gozirra 用于解决此问题的java库。 你可以 download 客户端库。然后将其放入libs文件夹。

    用于连接到服务器

     Client c = new Client("server url", port, "login", "password");
    

    为更新创建侦听器

     Listener listener=new Listener() {
                @Override
                public void message(Map map, String s) {
                    //Do your stuff
                }
            };
    

    然后订阅您的主题消息

     c.subscribe("foo-channel", listener);
    

    如果您想取消订阅,可以使用以下代码

      c.unsubscribe("foo-channel", listener);  // Unsubscribe only one listener
    

     c.unsubscribe("foo-channel");   // Unsubscribe all listeners
    

    用于断开客户端连接

    c.disconnect();
    

    我没有用真正的服务器测试这个。但我认为这会奏效。如果它能解决你的问题,请告诉我

    解决方案3

    正如你提到的图书馆 https://github.com/NaikSoftware/StompProtocolAndroid 你可以用这个。简化版本如下

    将maven链接添加到项目级渐变中

      repositories {
            maven { url "https://jitpack.io" }
        }
    

    在模块级渐变中添加依赖项

     implementation 'com.github.NaikSoftware:StompProtocolAndroid:1.1.5'
     implementation 'org.java-websocket:Java-WebSocket:1.3.0'
    

    然后使用以下代码获取消息

     StompClient mStompClient = Stomp.over(WebSocket.class, "ws://10.0.2.2:5000/");
    
    
        mStompClient.topic("/topic/general").subscribe(new Action1<StompMessage>() {
            @Override
            public void call(StompMessage stompMessage) {
                Log.e(TAG, stompMessage.getPayload());
            }
        });
        mStompClient.lifecycle().subscribe(new Action1<LifecycleEvent>() {
            @Override
            public void call(LifecycleEvent lifecycleEvent) {
                switch (lifecycleEvent.getType()) {
    
                    case OPENED:
                        Log.e(TAG, "Stomp connection opened");
                        break;
    
                    case ERROR:
                        Log.e(TAG, "Error", lifecycleEvent.getException());
                        break;
    
                    case CLOSED:
                        Log.e(TAG, "Stomp connection closed");
                        break;
                }
            }
        });
        mStompClient.connect();
    
        2
  •  6
  •   Ranjan    7 年前

    使用Square的OkHttp库。

    将此依赖项添加到构建梯度

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    

    在课堂下使用Webshocks听力

    public class SocketListner extends WebSocketListener {
    
        private Mediator mediator;
    
        private static final int CLOSURE_STATUS = 1000;
        private WebSocket webSocket = null;
    
        public SocketListner(Mediator mediator) {
            this.mediator = mediator;
        }
    
        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            super.onOpen(webSocket, response);
            this.webSocket = webSocket;
            mediator.onConnected(webSocket, response);
        }
    
        public void sendMsg(String msg) {
            if (webSocket != null)
                webSocket.send(msg);
        }
    
        @Override
        public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {
            mediator.onFailure(webSocket, t.getLocalizedMessage());
            AppCons.printTag("Failure :", t.getMessage());
        }
    
        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
            mediator.closingOrClosed(true, webSocket, reason, code);
            AppCons.printTag("Closed :", reason);
        }
    
        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            mediator.closingOrClosed(false, webSocket, reason, code);
            AppCons.printTag("Closing :", reason);
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String text) {
            mediator.getMessage(text);
        }
    
        public interface Mediator {
            void onConnected(WebSocket webSocket, Response response);
    
            void getMessage(String msg);
    
            void onFailure(WebSocket webSocket, String reason);
    
            void closingOrClosed(boolean isClosed, WebSocket webSocket, String reason, int code);
    
        }
    
        public WebSocket getWebSocket() {
            return webSocket;
        }
    }
    

    使用以下代码通过shocket访问数据

    private OkHttpClient client;
    private SocketListner listner;
    private void startShocketConnection() {
    
    
        client = new OkHttpClient.Builder().readTimeout(3, TimeUnit.SECONDS).build();
    
        listner = new SocketListner(new SocketListner.Mediator() {
            @Override
            public void onConnected(WebSocket webSocket, Response response) {
                Log.d("Connected :", response.toString());
            }
    
            @Override
            public void getMessage(String msg) {
                try {
                    Log.d("Received", msg);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onFailure(WebSocket webSocket, String reason) {
                //reconnect when failure with server
                Log.d("Failure :", reason);
            }
    
            @Override
            public void closingOrClosed(boolean isClosed, WebSocket webSocket, String reason, int code) {
                Log.d("ClosingOrClosed :", isClosed ? "Closed" : "closing");
            }
        });
    
        Request request = new Request.Builder()
                .url("your shocket url")
                .build();
        client.newWebSocket(request, listner);
    
    }
    
    private void closeSocket() {
    
            try {
                listner.getWebSocket().cancel();
                listner.getWebSocket().close(1000, "Good bye !");
    
                if ((response != null)) {
                    client.dispatcher().executorService().shutdown();
                    client.connectionPool().evictAll();
                    response.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            response = null;
        }