我可以将多个服务器绑定到同一个TCP端口吗?

时间:2012-07-19 22:32:38

标签: python port

我希望在同一端口上安装多台服务器会导致问题。实际上,当我尝试在同一端口上启动两个服务器时,我希望它抛出异常。问题是,在同一端口上启动多个服务器似乎非常乐意。我可以让以下代码的许多实例运行得很好,没有例外。

import BaseHTTPServer
import SimpleHTTPServer
import sys

def main():
    try:
        server = BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler)
        print "On port: " + str(server.socket.getsockname()[1])
    except Exception, e:
        print e
    server.serve_forever()

if __name__ == "__main__":
    main()

所有这些声称都在端口5000上。如果它尝试使用已经使用的端口,我怎么能让它抛出异常?

编辑:这是Python 2.6.4

编辑2:http://www.youtube.com/watch?v=rVOG3JdbHAM&feature=youtu.be因为人们似乎认为我所解释的是不可能的?或者我完全误解了人们。无论哪种方式,这个视频应该清除它。我启动了两台服务器,它们都没有打印出任何异常。当我关闭第一个时,第二个开始工作。为什么会这样?我希望第二台服务器根本不会启动并打印异常。这不是应该发生的事吗?

3 个答案:

答案 0 :(得分:1)

我尝试执行你的代码并返回第二个实例,

 [Errno 98] Address already in use

应该如此。 SuSE Linux上的Python 2.6。

可以使用netstat实用程序检查是否真的使用了端口5000?

答案 1 :(得分:0)

TCP端口只能由一个进程绑定。正如@phihag所指出的那样,你只认为你有多个绑定到端口5000的服务器,因为你丢弃的异常会告诉你已经绑定了该端口。

  

我在Windows 7上运行。它将端口状态列为TIME_WAIT

这是次要问题,通常是由于客户端没有正确关闭连接。 TIME_WAIT是一个valid TCP state,但需要2 minutes for the server to clear。您应该查看为什么您的客户端正在删除连接而不是让服务器关闭它。

如果您在客户端使用标准浏览器,您应该假设您的服务器代码中有第二个错误,而您在此处未显示。

在回复评论时添加了

您的期望有问题。这段代码应该清楚明白:

def bind():
    return BaseHTTPServer.HTTPServer(('127.0.0.1',5000), SimpleHTTPServer.SimpleHTTPRequestHandler)

s1 = bind()
s2 = bind()

最后一行将使用“Address in in use”异常中止您的程序。如果您选择忽略(或捕获并丢弃)异常,s2将没有有效的服务器。这就是异常告诉你的。在C中,如果您忽略错误的方式如下:

fp = fopen("a_file_that_does_not_exist", "r")
fgets(buf, BUFSIZ, fp)

fopenfgets都将返回您忽略的EOF。该程序将运行,但它肯定不会做任何有用的事情,因为你无法读取不存在的文件。您可以忽略错误返回但是将手放在眼睛上并不会使怪物消失。

答案 2 :(得分:0)

我同意各种答案和评论,表明您不能拥有多个侦听器到单个TCP端口;但是,我遇到的行为与OP相同。我正在运行Windows 8,我的程序实例(用C ++编写,使用Boost)都没有抛出异常。 netstat的输出如下:

C:\windows\system32>netstat -an

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:7112           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:17500          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49152          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49153          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49154          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49155          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:49157          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:50102          0.0.0.0:0              LISTENING
  TCP    0.0.0.0:50102          0.0.0.0:0              LISTENING
  TCP    127.0.0.1:2559         0.0.0.0:0              LISTENING
  TCP    127.0.0.1:19872        127.0.0.1:49248        ESTABLISHED
  TCP    127.0.0.1:49248        127.0.0.1:19872        ESTABLISHED
  TCP    127.0.0.1:50102        127.0.0.1:52616        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52618        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52620        TIME_WAIT
  TCP    127.0.0.1:50102        127.0.0.1:52622        TIME_WAIT

在这种情况下,开始侦听端口50102的第一个程序实例接收所有客户端连接。然后,当我关闭该实例时,第二个实例开始接收客户端连接。奇怪但真实。

我希望第二个程序实例无法开始侦听与第一个实例相同的端口。