如何在Javascript中从Vert.x服务器接收websocket消息?

时间:2015-08-04 14:58:30

标签: javascript java http websocket vert.x

我正在尝试使用Java中的Vert.x创建一个包含websockets的http服务器,同时使用Javascript编写客户端而不使用vertx.js。我避免在客户端使用Vert.x,因为它应该保持基于浏览器(像browserfy这样的工具没有成功将Vert.x的CommonJS标准转换为可供浏览器使用的代码)。

在完成服务器和客户端的测试代码之后,我尝试了向服务器发送消息,获取数据并使用任意响应进行应答的简单示例。服务器收到消息并能够读取内容。但是,客户端仅收到消息而未获取假定的内容。客户端无法将websocket接收的事件数据转换为字符串(根本没有字符串数据?)。使用indexof.js确定事件数据的字节大小,在服务器发送的内容改变几次后,导致34字节的常量大小。我尝试在服务器端使用writeMessage和write-method将数据发送到client-websocket。结果保持不变。

为什么我的客户端只接收websocket上常量大小的数据以及如何使其工作?

感谢您的建议!

修改 我使用tag交换方法writewriteMessage。使用writeFrame,可以发送二进制数据和纯文本。以这种方式从基于Java的服务器向基于Javascript的客户端发送文本工作正常。我仍然不知道如何在客户端处理二进制消息,但它仍然是有益的。虽然文本消息有效,但它们仍然具有相同的大小(34字节)。我认为收到的数据对象的大小会有所不同,但看起来,它只是一个指向实际数据的对象。

-------------------------------------------- ----

客户端代码是在使用Java Servlets和websockets进行(成功)测试期间编写的:

writeFrame

服务器端是根据官方Vert.x文档以及另一个another online-tutorial

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

1 个答案:

答案 0 :(得分:4)

原因是,我只收到0字节大小的消息相对简单:在Javascript-websocket中,可以定义websocket从服务器接收的(二进制)数据类型binaryType。默认情况下,它设置为"blob"。在我的情况下,我假设接收阵列缓冲区。相应地设置选项使websocket按预期传递数据:

websocket.binaryType = "arraybuffer";

要使用它,仍然需要从arraybuffer创建一个数组。就我而言,我创建了一个无符号8位整数数组:

var dataBytes = new Uint8Array(evt.data);

现在,数据已准备好由后续代码处理。