更大的应用程序如何处理潜在的 (web)socket 端口冲突?

Posted

技术标签:

【中文标题】更大的应用程序如何处理潜在的 (web)socket 端口冲突?【英文标题】:How do bigger applications deal with potential (web)socket port ***es? 【发布时间】:2017-08-17 13:29:41 【问题描述】:

我正在编写一个 chrome 插件和一个桌面应用程序之间的 websocket 连接,它们在本地相互独占。我知道你不能让两个套接字监听同一个端口(所有端口都是这样吗?)

我的大多数用户不会发生端口冲突,但该应用程序将在几千台计算机上运行;我认为我可以合理地预期在极少数情况下会发生冲突,即另一个应用程序已经占用了端口。

更大的应用程序如何处理这个潜在问题?一般来说,我对网络和(网络)套接字编程相当不熟悉。

我想有一些像这样的非技术解决方法:

    记录好问题,让支持人员处理 让用户配置一个端口

但如果可能的话,我宁愿有一种可靠的技术方法来处理它。我可以想出一些算法来尝试一些预配置的端口,但我希望这是业内相当知名的问题,我希望了解这个问题的共识是什么。

这个问题主要与技术无关,但如果重要的话,我的堆栈是 python,在桌面端带有 this websockets library,当然在客户端是 javascript

【问题讨论】:

【参考方案1】:

我认为没有理由过度考虑它。看似 unoccupied 后备端口的列表,最后提示指定端口应该没问题。如果双方都有HDD IO的能力(我不知道一个chrome插件能做多少),那么插件和app的见面就更容易了。

对于同一主机上的两个应用,您还可以添加一个额外的环回接口。 Example.

如果谈到大型网络,有一类所谓的服务发现协议可能有助于处理此类问题。基本上,它们是基于 IP 或 UDP 的多播协议,在网络上通告不同的服务。通常这些协议都有一个标准化的通信端口,因此不太可能被另一个应用程序占用。例如 DHCP、Bonjour。

但是,处理端口冲突并不是它们的主要功能。在大型网络中,机器应该受到某种控制,并且不应该有很多应用程序抓取随机端口。如果与第三方应用程序发生冲突,理想的解决方案是寻找允许手动设置端口的设置。

【讨论】:

我想最好的选择是使用定义两个或三个客户端和服务器都知道的任意开放端口。这很简单。如果无论如何都会发生端口冲突,我会让支持人员处理它。听起来不错:)【参考方案2】:

好吧,我不知道实际上有多大的应用程序可以做到这一点,但有一种方法可以尝试直到找到空闲端口?

found_port = False
ports = [port1, port2, port3 ....]
for port in ports
    try:
        mySocket.bind ( ( ip_address, port ) )
        found_port = True   
   except:
        pass
   if found_port:
       break

【讨论】:

这里有一些令人毛骨悚然的含义,客户端需要知道服务器端正在尝试侦听的套接字,对吗?我知道我对网络编程了解不多,所以我明确地试图避免自己找到这样的解决方案。 是的,谢谢 :)。为了说明这一点,我在答案中添加了一个 ports_list,客户端也可以尝试通过端口列表进行连接

以上是关于更大的应用程序如何处理潜在的 (web)socket 端口冲突?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 Web 图片优化?

发生管道损坏时如何处理 AJAX 响应?

如何处理Tomcat日志catalina.out日志文件过大的问题

如何处理内容大的响应式引导 3 表?

Socksifying Java ServerSocket - 如何处理

当 UI 允许新对象时如何处理取消