【问题标题】:Cordova chrome.socket API. Any example?Cordova chrome.socket API。有什么例子吗?
【发布时间】:2014-03-21 02:35:10
【问题描述】:

我正在尝试使用 org.chromium.socket 插件。但我找不到很多例子。这是我的代码:

var connButton = document.getElementById("connButton");

connButton.addEventListener("click", doConnect, false);

function doConnect() {
    var theSocketId = 0;
    chrome.socket.create("tcp", null, function(createInfo) {
        alert(createInfo.socketId);
        theSocketId = createInfo.socketId;
     });
     chrome.socket.connect(theSocketId, "http://www.yahoo.com", 80, function(result) {
        alert(result);
     });
chrome.socket.read(theSocketId, 1000, function(readInfo) {
      alert(readInfo.resultCode);
  });
  }

我尝试将主机名更改为不同的 IP 或更改端口。但有时我看到结果 = -1000,这表明失败。或者有时我看不到结果警报。我也有使用 chrome.socket.read 的问题。

请批评我的代码。非常感谢!

【问题讨论】:

    标签: cordova google-chrome-app


    【解决方案1】:

    此插件的最佳 API 示例可能是发布在 GitHub 上https://github.com/GoogleChrome/chrome-app-samples/ 的示例。它们适用于插件实现的 chrome.socket API。特别是,您可以查看TCP ServerWeb ServerWebsocket Server

    早在 9 月,我还使用该插件作为演示编写了一个简单的 Web 服务器;你可以找到它on GitHub here

    不过,这些示例都显示了服务器套接字——我没有一个很好的示例来向您展示客户端。

    就您的代码而言,有两点立即脱颖而出:

    首先,您尝试连接到 TCP 端口 0,这几乎肯定是不正确的。要连接到 HTTP 服务,您应该在地址中省略“http://”——只使用服务器名称,并使用 80 作为端口号。

    其次,您似乎在 chrome.socket.create 之后立即调用 chrome.socket.connect,在 chrome.socket.connect 之后立即调用 chrome.socket.read,而不是在回调中执行这些操作。这可能意味着连接调用可以在创建完成之前发出,或者读取调用可以在绑定调用完成之前发出。我将从嵌套调用开始,如下所示:

    chrome.socket.create("tcp", null, function(createInfo) {
        alert(createInfo.socketId);
        theSocketId = createInfo.socketId;
        chrome.socket.connect(theSocketId, "www.yahoo.com", 80, function(result) {
            alert(result);
            if (result === 0) {
                chrome.socket.read(theSocketId, 1000, function(readInfo) {
                    alert(readInfo.resultCode);
                });
            }
        });
    });
    

    但是,接下来要阻止它工作的是代码实际上并没有向服务器发送任何请求。 chrome.socket 是一个低级接口,因此如果您想通过 HTTP 进行通信,您的应用将不得不使用 HTTP。

    一段非常简单的示例代码将与 Web 服务器通信,并返回其主页的前一千字节,如下所示:

    // Utility functions to convert between array buffers and strings
    
    function stringToArrayBuffer(string) {
        var buffer = new ArrayBuffer(string.length);
        var bufView = new Uint8Array(buffer);
        for (var i=0; i < string.length; i++) {
            bufView[i] = string.charCodeAt(i);
        }
        return buffer;
    }
    
    function arrayBufferToString(buffer) {
        return String.fromCharCode.apply(null, new Uint8Array(buffer));
    }
    
    // Set the hostname; we'll need it for the HTTP request as well
    var hostname = "www.yahoo.com";
    
    chrome.socket.create("tcp", function(createInfo) {
        var socketId = createInfo.socketId;
        chrome.socket.connect(socketId, hostname, 80, function(result) {
            if (result === 0) {
                var requestString = "GET / HTTP/1.1\r\nHost: "+hostname+"\r\nConnection: close\r\n\r\n";
                var requestBuffer = stringToArrayBuffer(requestString);
                chrome.socket.write(socketId, requestBuffer, function(writeInfo) {
                    chrome.socket.read(socketId, 1000, function(readInfo) {
                        var htmlString = arrayBufferToString(readInfo.data);
                        // do something with htmlString here
                    });
                });
            }
        });
    });
    

    【讨论】:

    • 感谢您的评论。我想找到一些使用 API 的客户端代码,而不是服务器代码。
    • 非常感谢您的评论。至于端口,我之前试过80。但它们都返回第 n 个结果。但如果我使用 null,它会返回 -1000 作为结果。我最后一次尝试,使用 0 作为端口,我知道这显然是不正确的,也返回 nth。
    • 我把端口号从0改成了80,0明显不对。我只是尝试将其设置为 0 以查看是否发生任何事情。
    • 在端口之后,并将函数调用嵌套在回调中,我添加了上面的最后一步:在尝试读取数据之前发送 HTTP 请求。
    • TCP 和 Webserver 链接断开 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2021-03-16
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多