1

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

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因为人们似乎认为我在解释是不可能的?或者我完全误解了人们。无论哪种方式,这个视频都应该清除它。我启动了两台服务器,它们都没有打印出任何异常。当我关闭第一个时,第二个开始工作。为什么会这样?我希望第二台服务器永远不会启动并打印异常。这不应该发生吗?

4

3 回答 3

1

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

 [Errno 98] Address already in use

正如它应该。SuSE Linux 上的 Python 2.6。

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

于 2012-07-19T22:40:51.643 回答
0

一个 TCP 端口可以被一个且只有一个进程绑定。正如@phihag 所指出的,您只认为您有多个服务器绑定到端口 5000,因为您正在丢弃告诉您已经绑定该端口的异常。

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

这是一个次要问题,通常是由于客户端没有正确关闭连接造成的。TIME_WAIT 是一种有效的 TCP 状态,但服务器需要2 分钟才能清除。您应该查看为什么您的客户端会断开连接而不是让服务器关闭它。

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

添加以回应评论

你的期望有问题。这个版本的代码应该清楚:

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

s1 = bind()
s2 = bind()

最后一行将以“地址已在使用”异常中止您的程序。如果您选择忽略(或捕获并丢弃)异常,s2将没有有效的服务器。这就是异常告诉你的。在 C 语言中,如果您以同样的方式忽略错误,它看起来像:

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

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

于 2012-07-19T23:00:39.720 回答
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 的程序实例会接收所有客户端连接。然后,当我关闭该实例时,第二个实例开始接收客户端连接。奇怪但真实。

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

于 2014-03-05T15:15:02.240 回答