Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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
如何为多个使用者重用服务器端TCP端点?_Tcp_Websocket_Rust - Fatal编程技术网

如何为多个使用者重用服务器端TCP端点?

如何为多个使用者重用服务器端TCP端点?,tcp,websocket,rust,Tcp,Websocket,Rust,我是一个试图理解TCP的初学者,我正在使用Rust。如果我创建一个新的侦听器并将其绑定到一个地址 let tcplistener = TcpListener::bind("127.0.0.1:55555").unwrap(); 我可以tcplistener.accept()在127.0.0.1:55555和客户端上的某个其他端点之间建立新连接 在我的例子中,tcplistener存在于表示插件的结构实例中。每个插件都应该可以通过自己的浏览器选项卡进行控制。每个插件有一个连接(端点对),一个端点

我是一个试图理解TCP的初学者,我正在使用Rust。如果我创建一个新的侦听器并将其绑定到一个地址

let tcplistener = TcpListener::bind("127.0.0.1:55555").unwrap();
我可以
tcplistener.accept()
127.0.0.1:55555
和客户端上的某个其他端点之间建立新连接

在我的例子中,
tcplistener
存在于表示插件的结构实例中。每个插件都应该可以通过自己的浏览器选项卡进行控制。每个插件有一个连接(端点对),一个端点总是
127.0.0.1:55555
。插件在一个线程中运行,具有非阻塞侦听器和流。我使用WebSocket,但我不确定这个问题是否特定于WebSocket

我现在做的是

  • 实例化插件A
  • 接受从浏览器选项卡到插件的第一个连接
  • 然后,将插件A中的
    tcplistener
    字段分配给新创建的侦听器,该侦听器具有任意OS分配的端口
这似乎有效;如果我随后实例化一个新插件B,我可以创建一个绑定到
127.0.0.1:55555的侦听器并接受连接。如果我没有创建一个具有不同地址/端口的新侦听器,那么我会得到“地址已在使用”错误

这显然不是一个好的解决方案,因为它会无缘无故占用所有其他端口。有更好的方法吗?

有评论说:

为什么每个插件都有一个
TcpListener
?为什么不在侦听器中使用一个组件,调用
accept
,然后将返回的
TcpStream
传递给每个构建的插件

这听起来不错,但是那
TcpListener
将存储在哪里,它如何传递流?我认为存储的可能性:

  • 主持人。我不能修改插件主机,我只是一个插件作者
  • 一个专用插件。我看到的问题是插件无法访问存储在另一个插件中的任何信息,因此我不知道如何做到这一点
  • 一个单独运行的进程。我可以想象单独运行一台服务器,让插件成为客户端。用户可以将浏览器连接到服务器,服务器以某种方式代理插件。听起来很合理,但这里的不便之处在于插件用户必须将服务器作为单独的软件包安装。所以我真的想避免这样。虽然我认为启动服务器可以在插件实例化时自动完成,但也许这就是方法

如果我正确理解您的所有限制,一个解决方法是使用<代码>选项
正是用于“某物或非某物”的情况

在这里,您可以有一个
选项
。在新初始化的插件上,这将被设置为
Some(…)
,一旦被接受,将转换为
None

这确实有许多缺点:

  • 有一段时间没有听众
  • 您必须处理侦听器为
    None
    的可能性
  • 在第一个插件接受某些内容之前,不能启动第二个插件

某种亲子关系可能更好,甚至可以限制为单例插件,如果可能的话。

第一个建议(选项)有效!真是太棒了!我根本不了解期权的性质,我必须更彻底地阅读这些文件。到目前为止,它只用于空指针。我怎么能接受这个答案呢?关于实例化的建议:有趣的一点,我还没有完全考虑清楚。我的猜测是实例化只能从主机完成。如果这在技术上是可能的,那是不寻常的,因为我在其他地方没有见过它(当然,这并不意味着什么,我是一个初学者)。顺便说一句,这是所有关于LV2音频插件标准。你可能会感兴趣,感谢链接,这看起来很有趣!选择,是的!关于缺点的好观点。特别是第三个,我根本没想过。谢谢你的帮助!