Я пытаюсь создать http-сервер, включая веб-сокеты с Vert.x на Java, при написании клиента на Javascript без vertx.js. Я избегаю использования Vert.x в клиенте, потому что он должен оставаться ориентированным на браузер (такие инструменты, как browserfy, не преуспели в преобразовании CommonJS-стандарта Vert.x в код, который может использоваться браузерами).
После завершения тестового кода для сервера и клиента я попробовал простой пример отправки сообщения на сервер, получения его данных и ответа произвольным ответом. Сервер получил сообщение и смог прочитать его содержимое. Однако клиент получил только сообщение, не получив предполагаемого содержимого. Клиент не смог преобразовать данные события, полученные веб-сервером, в строку (вообще никаких строковых данных?). Используя indexof.js для определения байтового размера данные события привели к постоянному размеру 34 байта после изменения содержимого, отправляемого сервером, несколько раз. Я попытался использовать writeMessage, а также метод записи на стороне сервера для отправки данных в клиентский веб-сокет. Результаты остались прежними.
Почему мой клиент получает в веб-сокете только данные постоянного размера и как заставить их работать?
Спасибо за ваши предложения!
РЕДАКТИРОВАТЬ: Я обмениваю методы write
и writeMessage
на writeFrame
. С writeFrame
можно отправлять двоичные данные, а также простой текст. Отправка текста таким способом с сервера на основе Java на клиент на основе Javascript работает нормально. Я до сих пор не знаю, как обрабатывать двоичные сообщения на стороне клиента, но, тем не менее, это было бы полезно. Хотя текстовые сообщения работают, предполагается, что они имеют тот же размер (34 байта). Я думал, что полученный объект данных будет различаться по размеру, но, похоже, это просто объект, который где-то указывает на фактические данные.
----------------------------------------------- -
Клиентский код был написан во время (успешных) тестов с сервлетами Java и веб-сокетами:
var wsUri = "ws://" + document.location.host + document.location.pathname + "chat";
var websocket = new WebSocket(wsUri);
websocket.onerror = function(evt) { onError(evt) };
websocket.onopen = function (evt) { onOpen(evt) };
function onError (evt)
{
debugMessage('<span style="color: red;">ERROR:</span> ' + evt.data);
}
function onOpen (evt)
{
// debugMessage("Connected to " + wsUri);
debugMessage("GOTCHA!");
}
websocket.onmessage = function (evt) { onMessage(evt) };
function onMessage (evt)
{
debugMessage(evt.toString());
debugMessage(evt.data.toString());
debugMessage(sizeof(evt.data));
}
function sendMessage (msg)
{
websocket.send(msg);
}
function sendDebugMessage ()
{
websocket.send("Hiho Wursty!");
debugMessage("Did send Wursty-message.");
}
Серверная часть соответствует официальной документации Vert.x, а также другой другое онлайн-руководство:
server = vertx.createHttpServer();
server.requestHandler(request -> {
handleRequest(request);
});
server.websocketHandler(ws -> {
print("Websocket-handshake...");
print("path = " + ws.path());
print("uri = " + ws.uri());
print("localAdress = " + ws.localAddress().toString());
print("remoteAddress = " + ws.remoteAddress());
print(ws.toString());
if (!ws.path().equals("/chat")) {
ws.reject();
} else {
SharedData sd = vertx.sharedData();
LocalMap<String, String> wsChatSessions =
sd.getLocalMap("ws.chat.sessions");
wsChatSessions.put(ws.textHandlerID(), ws.toString());
ws.closeHandler(ch -> {
print("Closing ws-connection to client " + ws.textHandlerID());
wsChatSessions.remove(ws.textHandlerID());
});
ws.handler(new Handler<Buffer>(){
@Override
public void handle(final Buffer data) {
String msg = data.getString(0, data.length());
print("Message from ws-client " + ws.textHandlerID()
+ ": " + msg);
Buffer resp = Buffer.buffer();
resp.appendString("O Ding Dong asd asda sdasd a"
+ "asdasd asd asdasda sdas dasd adads asd as"
+ "as dasd asd asd asd asdasd asdasdasd "
+ "asdasd asd asd asd asd asda sdasd asd !");
ws.writeMessage(resp);
ws.write(resp);
}
});
}
});
server.listen(port, res -> {
if (res.succeeded()){
print("Listening...");
} else{
print("Failed to bind! -> Server is not listening"
+ " to incoming client connections.");
}
});