无法通过本地网络外部连接到Chrome应用程序tcp服务器

时间:2014-10-28 01:43:01

标签: google-chrome-app tcpserver listen

我没有设法从互联网访问chrome app tcp服务器。 防火墙和家庭网络配置良好,我尝试通过同一端口使用本机c ++ tcp服务器进行管理。

我的清单就是这样:

"sockets": {
    "tcpServer": {
        "listen": "*"
    }
}

和我的tcpServer一样启动:

// ...
chrome.sockets.tcpServer.create({name:"chrome-local-tcp-server", persistent:false}, function(createInfo) {
    _this.info = createInfo;

    // Listening TCP server
    chrome.sockets.tcpServer.listen(createInfo.socketId, "127.0.0.1", 8000, null, function(result) {
        // ...
    });
}):

仅本地主机客户端连接工作


function WebSocketServer(port)
{
    this.port = port;
    this.ips = [];
    this.ip_serverInfo = {};
    this.webSockets = [];
    this.socketId_webSocket = {};

    var _this = this;

    chrome.system.network.getNetworkInterfaces(function(interfaces) {
        interfaces.forEach(openSocket);
    });

    function openSocket(interface) {
        chrome.sockets.tcpServer.create({name:"chrome-local-tcp-server", persistent:false}, function(createInfo) {
            _this.ips.push(interface.address);
            _this.ip_serverInfo[interface.address] = createInfo;

            chrome.sockets.tcpServer.listen(createInfo.socketId, interface.address, port, null, function(resultCode) {
                if (resultCode < 0)
                {
                    console.log("Error listening: "+chrome.runtime.lastError.message);
                }
                else
                {
                    console.log("tcpServer listenning on "+interface.address+":"+port, createInfo);
                }
            });
        });
    }

    // New connection
    chrome.sockets.tcpServer.onAccept.addListener(function(info) {
        debug && console.log("tcpSocket accepted", info);
        var ws = new WebSocket(info);
        _this.webSockets.push(ws);
        _this.socketId_webSocket[info.clientSocketId] = ws;
        ws.closeTcpSocket = function(clientInfo) {
            // close TCP connection
            chrome.sockets.tcp.disconnect(clientInfo.clientSocketId, function() {
                chrome.sockets.tcp.close(clientInfo.clientSocketId, function() {
                    console.log("tcpSocket closed", clientInfo);
                    delete _this.socketId_webSocket[clientInfo.clientSocketId];
                    arrayRemoveValue(_this.webSockets, ws);
                });
            });
        };
    });

    // Connection error
    chrome.sockets.tcpServer.onAcceptError.addListener(function(info) {
        console.error("tcpServer onAcceptError", info);
    }); 

    // on received data
    chrome.sockets.tcp.onReceive.addListener(function(info) {
        //console.log("onReceive", info);
        var ws = _this.socketId_webSocket[info.socketId];
        if (ws)
        {
            ws.tcpDataReceived(info.data);
        }
    });

    // on received error
    chrome.sockets.tcp.onReceiveError.addListener(function(info) {
        if (info.resultCode !== -15)
        {
            console.error("tcp socket onReceiveError", info);
        }
    });
}

2 个答案:

答案 0 :(得分:4)

您必须了解打开服务器套接字的“地址”参数是什么。套接字仅侦听特定接口上的连接,由网络地址表示。

在您的清单中,您允许您的应用将套接字绑定到"listen": "*"的任何接口。

然而,这一行:

chrome.sockets.tcpServer.listen(createInfo.socketId, "127.0.0.1", 8000, null, function(result) {
    // ...
});

您明确地将您的套接字绑定到地址127.0.0.1,这是一个仅限本地的接口。没有其他机器可以通过此地址连接到您的机器。

如果您查看各种Chrome应用副本like this one,则会显示界面选择。从查看Chrome源代码,例如here,似乎API不允许绑定到INADDR_ANY之类的“任何界面”。

因此,您需要收集chrome.system.network.getNetworkInterfaces的可用接口,并让用户选择,尝试猜测相应的接口,或者只为每个接口创建一个套接字。


显然这需要进一步解释。侦听连接的打开套接字绑定到某个网络接口。计算机可以有多个接口,因此有几个IP地址。

127.0.0.1是一个只在本地工作的特殊网络接口。您需要绑定到计算机的地址(例如,192.168.1.2)以接收外部连接。您不需要知道连接人员的IP,如果您在端口转发路由器后面,甚至不需要“外部IP” - 只有您的网卡地址

您可以通过声明"system.network"权限并致电chrome.system.network.getNetworkInterfaces()来获取分配给您计算机的所有地址:

chrome.system.network.getNetworkInterfaces(function(interfaces) {
  interfaces.forEach(function(interface) {
    console.log(interface);
  });
});

这将列出所有网络接口。你需要选择一个(通过向用户提供选择,或以某种方式自己选择一个),或者你可以绑定每个接口的套接字来全部监听。以下是如何完成的示例:

chrome.system.network.getNetworkInterfaces(function(interfaces) {
  interfaces.forEach(openSocket);
});

function openSocket(interface) {
  chrome.sockets.tcpServer.create(
    {name:"chrome-local-tcp-server", persistent:false},
    function(createInfo) {
      _this.info = createInfo;

    // Listening TCP server
    chrome.sockets.tcpServer.listen(
      createInfo.socketId,
      interface.address, 8000, null,
      function(result) {
        // ...
      }
    );
  });
}

答案 1 :(得分:0)

找到解决方案。我不得不在我的Windows防火墙中打开端口。这个Chrome功能并没有自动完成!