Почему мой клиент websocket отключается, как только я отправляю сообщение? - PullRequest
0 голосов
/ 09 мая 2019

У меня есть клиент websocket в Java, который может подключиться к серверу. Он получает сообщение пульса от сервера каждые 10 секунд (до тех пор, пока не прошло 30 секунд, он по какой-то причине отключается, но пока игнорирует это). Однако, если я отправлю сообщение в течение этих первых 30 секунд, я сразу же получу уведомление о том, что соединение закрылось с кодом причины 1000.

У меня есть похожий клиент на python, который отлично работает, подключаясь к тому же серверу. Я эффективно пытаюсь реализовать эту же функциональность в Java, но не могу заставить его работать.

Фрагмент клиента веб-сокета. Я должен был переопределить перед запросом, чтобы передать в cookie:

ClientEndpointConfig clientEndpointConfig = ClientEndpointConfig.Builder.create()
    .configurator(new ClientEndpointConfig.Configurator() {
        @Override
        public void beforeRequest(Map<String, java.util.List<String>> headers) {
            super.beforeRequest(headers);
            List<String> cookieList = headers.get("Cookie");
            if (null == cookieList) {
                cookieList = new ArrayList<String>();
            }
            cookieList.add("User-Session-Token=\"" + SESSION_COOKIE + "\"");     // set your cookie value here
            headers.put("Cookie", cookieList);
            System.out.println(cookieList.size() + ": " + cookieList.get(0));
        }
    }).build();


String uri = "wss://live.someurl.com/sockjs/997/" + SESSION_ID + "/websocket";

Endpoint myEndpoint = new MyClientEndpoint();

WebSocketContainer container = ContainerProvider.getWebSocketContainer();

Session session = container.connectToServer(myEndpoint,     clientEndpointConfig, URI.create(uri));   

String name = "{\"path\":\"blah\"}";
System.out.println("Sending message to endpoint: " + name);
Future<Void> abc = session.getAsyncRemote().sendText(name);

И конечная точка:

@ClientEndpoint
public class MyClientEndpoint extends Endpoint{


@Override
public void onOpen(Session session, EndpointConfig arg1) {

    session.addMessageHandler(new MessageHandler.Whole<String>() {

        @Override
        public void onMessage(String arg0) {
            // TODO Auto-generated method stub
            System.out.println("Message received: " + arg0);
        }

    });
}

}

Если это поможет, то смелость кода Python, который работает, выглядит следующим образом:

class MyWebsocketClass:
def __await__(self):
    log("Initializing Classes......")
    return self._async_init().__await__()

async def _async_init(self):
    #create socket conn
    self._conn = connect(f'wss://live.someurl.com/sockjs/997/{SESSION_ID}/websocket',
                         extra_headers=[("Cookie", SESSION_COOKIE)])
    log("Connected to websocket......")
    self.websocket = await self._conn.__aenter__()  # not sure what this is?
    return self

async def close(self):
    await self._conn.__aexit__(*sys.exc_info())

async def send(self, message):
    await self.websocket.send(json.dumps(message))

async def receive(self):
    return await self.websocket.recv()
...