我想知道是否有任何方法可以使用socket.io-client在两个浏览器之间建立P2P连接(但我愿意使用其他任何可能的技巧)。
两个浏览器当前都连接到一个node.js应用程序,该应用程序使用Express提供HTTP请求,该应用程序存储客户端的IP地址(以及本地运行时的端口)。我想要做的是添加第三个连接,直接链接两个客户端(让我们称之为A和B),这样消息/数据将直接从一个客户端转移到另一个客户端,而无需通过node.js服务器进行转换。 / p>
这可行吗?如果是这样,怎么样?
到目前为止,我已尝试使用以下代码连接两个客户端(让我们称之为A和B):
客户A:
A_to_server_socket = io();
A_to_server_socket.on('p2p', function(address_B){
A_to_B_socket = io(address_B); // Instantiates a new socket
A_to_B_socket.on('connect', function() {
console.log('Connected!');
});
});
我不确定客户端B的代码。但我尝试过:
使用B自己的地址重复上面的B代码(覆盖连接服务器的默认设置)
重复上面的B代码,这次是使用A的地址
让B_to_server_socket侦听新的连接事件
然而,不管B的代码如何,当运行A的代码时,我遇到了Firefox上的“跨源请求被阻止”错误,或者“无法加载资源:net :: ERR_CONNECTION_REFUSED”,后跟“net :: ERR_CONNECTION_REFUSED”在Chrome上。
任何有关解决方案的提示,或有助于更好地理解问题以及插槽如何工作的见解都将受到欢迎。
答案 0 :(得分:2)
我会尝试将我的评论总结为答案。
在TCP中,当一个端点A连接到另一个端点B时建立连接。要连接到端点B,该主机必须“侦听”来自其他主机的传入连接。在典型的Web请求中,浏览器建立与Web服务器的TCP连接,这是因为Web服务器正在侦听特定端口上的传入请求,并且当其中一个请求进入时,它接受传入的请求以建立活动TCP连接。因此,您必须让一方发起请求,另一方听取请求。
出于各种安全原因,浏览器本身不会“监听”传入连接,因此您无法直接连接到它们。它们只允许您将出站连接到Internet上的其他侦听代理。因此,如果浏览器从不侦听传入的webSocket连接,那么就无法建立真正的对等(例如浏览器到浏览器)webSocket连接。
此外,TCP的设计使得您不能让两个浏览器都连接到公共服务器,然后以某种方式使该服务器连接其管道,这样两个浏览器现在只是直接相互连接。 TCP只是不起作用。中间的代理可以通过与每个客户端的单独连接(即聊天应用程序通常如何工作)将数据包从一个客户端转发到另一个客户端,但中间的代理不能简单地将两个TCP连接一起插入,以便数据包直接从一个客户端转到另一个客户端(并且不再通过服务器),因为消防员将连接两个消防员。 TCP就是这样做的。可能有一些复杂的方案涉及将数据包标头重写为从endPoint A发送的数据包被转发到endPoint B,看起来它来自服务器,但仍然涉及服务器作为中间人或代理。
解决此问题的常用方法是让每个浏览器连接到公共服务器,让服务器充当中间人或交通警察,将数据包从一个浏览器转发到另一个浏览器。
现有的P2P应用程序(浏览器之外)通过让每个客户端实际侦听传入连接(充当服务器)来工作,以便另一个客户端可以直接连接到它们。 P2P本身比这更复杂,因为需要有一种方法来发现要连接的IP地址(因为客户端通常不在DNS中)并且通常存在防火墙,需要在两端之间进行一些合作才能按顺序使防火墙允许传入连接。但是,唉,这种监听传入连接的能力并不是普通javascript允许你做的浏览器。
答案 1 :(得分:0)
没有类似“使用socket.io-client的两个浏览器之间的连接。”
但是“两个浏览器都连接到一个node.js应用程序,使用Express提供HTTP请求,跟踪客户端的IP地址(以及本地运行时的端口)。”
如果您想在两个浏览器之间建立P2P连接,可以采用以下方法。
在客户端A和客户端B之间进行交换,请使用
socket.broadcast.to('P2P')。emit(“message”,“早安”);
希望这可能会有所帮助。