当前位置: 首页 > 知识库问答 >
问题:

okhttp中的多个连接websocket

柳韬
2023-03-14

我是使用节点js(ws库)开发的网页登录服务器

我想将聊天模块添加到android应用程序。我正在为websocket客户端使用okhttp。当从设备连接时,它正在工作。但是当连接第二台设备时,它不工作。只有第一台设备websocket.on(“消息”)事件发射器会做出响应。另一台设备不监听onMessage。只有一台设备监听A. B-

如何配置onMessage在所有设备上工作?

java客户端:

class SConnection {
    SConnection(String url) {
        mClient = new OkHttpClient.Builder()
                .readTimeout(3,  TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .build();

        mServerUrl = url;
    }

    public enum ConnectionStatus {
        DISCONNECTED,
        CONNECTED
    }

    public interface ServerListener {
        void onNewMessage(String message);
        void onStatusChange(ConnectionStatus status);
    }

    private WebSocket mWebSocket;
    private OkHttpClient mClient;
    private String mServerUrl;
    private Handler mMessageHandler;
    private Handler mStatusHandler;
    private ServerListener mListener;


    public class SocketListener extends WebSocketListener {
        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            Message m = mStatusHandler.obtainMessage(0, ConnectionStatus.CONNECTED);
            mStatusHandler.sendMessage(m);
        }

        @Override
        public void onMessage(WebSocket webSocket, String text) {
            Message m = mMessageHandler.obtainMessage(0, text);
            mMessageHandler.sendMessage(m);
        }

        @Override
        public void onClosed(WebSocket webSocket, int code, String reason) {
            Message m = mStatusHandler.obtainMessage(0, ConnectionStatus.DISCONNECTED);
            mStatusHandler.sendMessage(m);
        }

        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            disconnect();
        }
    }

    void connect(ServerListener listener) {
        Request request = new Request.Builder()
                .url(mServerUrl)
                .build();
        mWebSocket = mClient.newWebSocket(request, new SocketListener());
        mListener = listener;
        mMessageHandler = new Handler(msg -> {mListener.onNewMessage((String) msg.obj);  return true;});
        mStatusHandler = new Handler(msg -> { mListener.onStatusChange((ConnectionStatus) msg.obj);   return true;});
    }

    void disconnect() {
        mWebSocket.cancel();
        mListener = null;
        mMessageHandler.removeCallbacksAndMessages(null);
        mStatusHandler.removeCallbacksAndMessages(null);
    }

    void sendMessage(String message) {
        mWebSocket.send(message);
    }

nodejs中的websocket服务器:

module.exports = (httpsServer) => {

    const WebSocketServer = require('ws').Server;
    const wss = new WebSocketServer({
        server: httpsServer
    });

    wss.on('connection', function connection(ws) {
        console.log('connected');

        ws.on('message', function incoming(message) {
            ...
            ws.send(JSON.stringify(response));
        });
    });
    wss.on('close', function close() {
        console.log('disconnected');
    });
};

也许添加这个解决问题,但如何?

{'force new connection':true} 

共有1个答案

方安怡
2023-03-14

首先了解问题,阅读所有评论:

wss.on('connection', function connection(ws) {

    // So here ws is the user got connected
    console.log('connected');    

    // This will be fired when connected user send message
    ws.on('message', function incoming(message) {
        ...
        // this will send message to the same user
        ws.send(JSON.stringify(response));
    });

});

解决方案:所以你需要做的就是让所有客户都寄给所有期望自己,这就是你如何做到的:

ws.on('message', function incoming(data) {
    // Broadcast to everyone else.
    wss.clients.forEach(function each(client) {
        if (client !== ws && client.readyState === WebSocket.OPEN) {
            client.send(data);
        }
    });
});

有关更多详细信息,请阅读

 类似资料:
  • 我正在使用OkHTTP客户端访问HTTP/2服务器。我有一个用例,我想在同一个连接上打开多个流。 我正在使用以下代码创建OkHTTP客户端。 此客户端在连接池中可以有5个打开的连接。现在我想使用上面的客户端提出以下请求, 我希望这些请求在同一个连接上作为一个单独的流,而不是一个新的连接。我该怎么做?

  • 在我在Intellij中运行的spring boot应用程序中,我有一个@Scheduled任务,两个WebSocket流使用OkHttp连接从两个不同的OkHttpClients实例打开到两个不同的服务器。我不认为OkHttpClient中的连接池设置。Builder与此相关,因为OkHttpClient有两个实例。两个websocket流最初都接收一些事件,然后其中一个不再接收任何事件。我还通

  • 问题内容: 目前,我的连接 mongoose.js 具有以下代码: 需要连接的文件是 test.js : 如何更新mongoose.js以使用mongoose.createConnection(…)函数使用多个连接? 当我进行如下更改时,我仅从一个连接的更改开始: 我得到“未定义不是函数”。如果我使用此代码: 我收到“错误:尝试打开未关闭的连接” 有什么建议吗? 问题答案: mongoose通过

  • 我有一些元素,我想通过JSPlumb社区版将它们连接起来。我在javascript中有以下代码行: 我想做的是在运行时制作两个和一个,并将两个源endpoint连接到目标endpoint,但当我将一个源endpoint连接到目标endpoint时,目标不会接受第二个源endpoint。我该怎么做?

  • 在请求完成后,应该如何告诉OkHttp关闭与HTTP服务器的连接? 假设我使用以下代码向google发出请求。通用域名格式 通过使用“连接:关闭”,我能够让远程服务器发送FIN(如果我不这样做,远程服务器只是挂起等待新请求)。尽管如此,在客户端没有产生FIN,并且连接保持半打开显然有一段不确定的时间。

  • 我想将配置文件中的多个Cassandraendpoint提供给我的Java应用程序。 例如:cassandra主机:“主机1,主机2” 我尝试了< code > addContactPoints(host),但它不起作用。如果其中一个Cassandra节点关闭,我不希望我的应用程序关闭。