I am trying to create an http-server including websockets with Vert.x in Java, while writing the client in Javascript without vertx.js. I avoid using Vert.x in the client because it should stay browserbased (tools like browserfy didn't succeed in converting the CommonJS-standard of Vert.x into code which can be used by browsers).
After completing test-code for both server and client, I tried the simple example of sending a message to the server, getting its data and answering with an arbitrary response. The server received the message and was able to read the content. However, the client only received a message without getting the assumed content. The client wasn't able to convert the event-data received by the websocket to a string (no string-data at all?). Using indexof.js to determine byte-size of the event-data resulted in a constant size of 34 bytes after varying the content, sent by the server, several times. I tried to use the writeMessage as well as write-method on the serverside to send data to the client-websocket. The results stayed the same.
Why does my client only receive data of constant size on the websocket and how to make it work?
Thank your for your suggestions!
EDIT:
I exchanges the methods write
and writeMessage
with the use of writeFrame
. With writeFrame
one can send binary data as well as plain text. Sending text this way from the Java-based server to the Javascript-based client works fine. I still don't know how to handle binary messages on the clientside, but it would be beneficial nontheless. While text-messages work, they are assumed to still have the same size (34 byte). I thought the received data-object would vary in size but it seems, it is just an object which somewhere points to the actual data.
------------------------------------------------
The client-code was written during (successful) tests with Java Servlets and websockets:
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.");
}
The serverside is according to the official Vert.x-documentation as well as another another online-tutorial:
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.");
}
});
The reason, I received only messages of 0 bytes size was relatively simple: In the Javascript-websocket, one can define the type of (binary) data received by the websocket from the server, the binaryType
. As default, it is set "blob"
. In my case, I assumed to receive arraybuffers. Setting the option accordingly made the websocket pass down the data as expected:
websocket.binaryType = "arraybuffer";
To use it, it is still necessary to create an array from the arraybuffer. In my case, I created an array of unsigned 8-Bit-integers:
var dataBytes = new Uint8Array(evt.data);
Now the data is ready to be processed by subsequent code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With