如何在 Chrome 应用程序上使用 Javascript 通过 UDP 发送字符串

How to send string over UDP using Javascript on Chrome app

我正在编写一个 chrome 应用程序,我想通过 UDP 将一些字符串发送到某个服务器。我是 javascript 的新手,有点卡住了。这是代码片段:

var wholeString = "what is the meaning of life";            

chrome.sockets.udp.create({}, function (socketInfo) {
    // The socket is created, now we can send some data
    var socketId = socketInfo['socketId'];
    var arrayBuffer = stringToArrayBuffer("hello");
    chrome.sockets.udp.bind(socketId, "127.0.0.1", 0, function (result) {
        chrome.sockets.udp.send(socketId, stringToArrayBuffer(wholeString), "127.0.0.1", 3050, function (sendInfo) {
            console.log("sent " + sendInfo.bytesSent);
            if (sendInfo.resultCode < 0) {
                console.log("Error listening: " + chrome.runtime.lastError.message);
            }
        });
    });
});

问题出在我尝试 send() 时,参数 stringToArrayBuffer(wholeString) 有问题。 stringToArrayBuffer() 在这里:

function stringToArrayBuffer(string) {
    var arrayBuffer = new ArrayBuffer(string.length * 2);
    var buffer = new Uint8Array(arrayBuffer);
    for (var i = 0, stringLength = string.length; i < stringLength; i++) {
        buffer = string.charCodeAt(i);
    }
    return buffer;
}

我收到的错误信息是:

Error in response to sockets.udp.bind: Error: Invocation of form sockets.udp.send(integer, integer, string, integer, function) doesn't match definition sockets.udp.send(integer socketId, binary data, string address, integer port, function callback)
    at Object.callback (chrome-extension://pmkjeflkfhfekliappbhemngaejmnbec/helper.js:45:24)
    at Object.callback (chrome-extension://pmkjeflkfhfekliappbhemngaejmnbec/helper.js:42:23)

我认为该函数会将我的字符串更改为字节数组?怎么了??

您的 stringToArrayBuffer 函数中有一个小错误。

function stringToArrayBuffer(string) {
    var arrayBuffer = new ArrayBuffer(string.length * 2);
    var buffer = new Uint8Array(arrayBuffer);
    for (var i = 0, stringLength = string.length; i < stringLength; i++) {
        buffer[i] = string.charCodeAt(i);
        // Was: buffer = string.charCodeAt(i);
    }
    return buffer;
}

所以你只是用一个整数值覆盖了二进制数组。

不过我不确定这是唯一的问题。你为什么使用 Uint8 而不是 Uint16?请参阅 this guide 链接自 Chrome 文档。