Несколько соединений websocket в охттп - PullRequest
0 голосов
/ 29 ноября 2018

Я разработал сервер веб-сокетов с использованием nodejs (библиотека ws)

Я хочу добавить модуль чата в приложение для Android.Я использую okhttp для клиента websocket.При подключении с устройства это работает.Но при подключении второго устройства оно не работает.Отвечает только первый отправитель события websocket.on ("message").Другие устройства не прослушивают сообщение.Только устройство слушает A. B-> 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:

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 Ответ

0 голосов
/ 30 ноября 2018

Сначала поймите проблему, прочитайте все комментарии :

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);
        }
    });
});

Для более подробной информации DO READ

...