У меня есть клиент 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()