我没有设法从互联网访问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);
}
});
}
答案 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功能并没有自动完成!