Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将两个socket.io客户端连接在一起(建立套接字到套接字、跨浏览器连接)_Javascript_Node.js_Sockets_Express_Socket.io - Fatal编程技术网

Javascript 将两个socket.io客户端连接在一起(建立套接字到套接字、跨浏览器连接)

Javascript 将两个socket.io客户端连接在一起(建立套接字到套接字、跨浏览器连接),javascript,node.js,sockets,express,socket.io,Javascript,Node.js,Sockets,Express,Socket.io,我想知道是否有任何方法可以使用socket.io-client在两个浏览器之间建立P2P连接(但我愿意使用其他任何方法) 这两种浏览器当前都连接到一个node.js应用程序,该应用程序使用Express提供HTTP请求,该应用程序存储两个客户端的IP地址(以及在本地运行时的端口)。我想做的是添加第三个连接,直接链接两个客户端(我们称它们为a和B),这样消息/数据就可以直接从一个客户端传递到另一个客户端,而无需通过node.js服务器 这可行吗?如果是,怎么做 到目前为止,我已尝试使用以下代码连接

我想知道是否有任何方法可以使用socket.io-client在两个浏览器之间建立P2P连接(但我愿意使用其他任何方法)

这两种浏览器当前都连接到一个node.js应用程序,该应用程序使用Express提供HTTP请求,该应用程序存储两个客户端的IP地址(以及在本地运行时的端口)。我想做的是添加第三个连接,直接链接两个客户端(我们称它们为a和B),这样消息/数据就可以直接从一个客户端传递到另一个客户端,而无需通过node.js服务器

这可行吗?如果是,怎么做

到目前为止,我已尝试使用以下代码连接两个客户端(我们称它们为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_到服务器\u套接字侦听新的连接事件

  • 然而,不管B的代码是什么,当运行A的代码时,我会在Firefox上遇到“跨源请求被阻止”错误,或者在Chrome上遇到“加载资源失败:net::ERR\u CONNECTION\u densed”,然后是“net::ERR\u CONNECTION\u densed”


    任何关于解决方案的提示,或更好地理解问题和套接字如何工作的见解,都是最受欢迎的。

    没有类似“使用socket.io客户端在两个浏览器之间建立连接”的东西

    但也有“两个浏览器都连接到一个node.js应用程序,该应用程序使用Express服务HTTP请求,它跟踪两个客户端的IP地址(以及本地运行时的端口)。”

    如果您想在两个浏览器之间建立P2P连接,下面可能是一种方法

  • 当你获得客户端连接时,加入到一个房间“P2P”
  • 当您获得客户端B连接时,加入一个房间“P2P”
  • 要在客户端A和客户端B之间进行交换,请使用

    socket.broadcast.to('P2P').emit(“消息”,“早上好”)


  • 希望这能有所帮助。

    我会尝试将我的评论总结成一个答案

    在TCP中,当一个端点a连接到另一个端点B时建立连接。要连接到端点B,该主机必须“侦听”来自其他主机的传入连接。在典型的web请求中,浏览器会建立到web服务器的TCP连接,这是因为web服务器正在侦听特定端口上的传入请求,当其中一个请求传入时,它会接受传入请求以建立活动的TCP连接。因此,您必须让一方发起请求,另一方监听请求

    出于各种安全原因,浏览器本身不“监听”传入连接,因此您无法直接连接到它们。它们只允许您将出站连接到internet上的其他侦听代理。因此,如果浏览器从不侦听传入的webSocket连接,则无法建立真正的对等(例如浏览器到浏览器)webSocket连接

    此外,TCP的设计使得您不能让两个浏览器都连接到一个公共服务器,然后让该服务器连接它们的管道,这样两个浏览器现在就直接连接到彼此。TCP就是不能那样工作。中间可能有一个代理,通过一个单独的连接将每个客户端从一个客户端转发到另一个客户端(这就是聊天应用程序通常工作的方式),但是中间的代理不能简单地将两个TCP连接插在一起,使得数据包直接从一个客户端转到另一个客户端。(并且不再通过服务器)就像消防员连接两根消防水管一样。TCP就是不这样工作。可能会有一些复杂的方案,其中包括将数据包头重写为从端点a发送到端点B的数据包,该数据包被转发到端点B,看起来像是来自服务器,但这仍然涉及到服务器作为中间人或代理

    解决此问题的通常方法是让每个浏览器连接到一个公共服务器,让服务器充当中间人或交通警察,将数据包从一个浏览器转发到另一个浏览器


    现有P2P应用程序(浏览器之外)的工作原理是让每个客户端实际侦听传入的连接(就像服务器一样),以便另一个客户端可以直接连接到它们。P2P本身比这更复杂,因为需要有一种方法来发现要连接的IP地址(因为客户端通常不在DNS中)通常情况下,防火墙的两端需要一些合作,以使防火墙允许传入连接。但是,唉,这种监听传入连接的功能不是普通javascript浏览器所允许的。

    客户端socket.io库不监听inc打开连接,如果打开了,则浏览器背后的任何防火墙都会阻止传入连接。WebSockets的整个原理是客户端将出站连接到服务器,这就是您处理防火墙的方式。服务器(或其他客户端)无法连接到客户端。哦,我应该补充一点,浏览器不允许监听传入的连接,所以这不仅仅是socket.io限制。好的。但假设我没有防火墙,比如在本地运行应用程序时。真的没有“强制”的方法通过告诉两个客户端套接字侦听彼此的IP+端口来建立连接?不,没有,因为浏览器不会侦听新连接。对于WebSocket,它根本不会这样做(出于安全原因)。它只进行出站连接。一方必须侦听新连接才能直接连接两个端点,因此如果