我希望在同一端口上安装多台服务器会导致问题。实际上,当我尝试在同一端口上启动两个服务器时,我希望它抛出异常。问题是,在同一端口上启动多个服务器似乎非常乐意。我可以让以下代码的许多实例运行得很好,没有例外。
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因为人们似乎认为我所解释的是不可能的?或者我完全误解了人们。无论哪种方式,这个视频应该清除它。我启动了两台服务器,它们都没有打印出任何异常。当我关闭第一个时,第二个开始工作。为什么会这样?我希望第二台服务器根本不会启动并打印异常。这不是应该发生的事吗?
答案 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)
fopen
和fgets
都将返回您忽略的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的第一个程序实例接收所有客户端连接。然后,当我关闭该实例时,第二个实例开始接收客户端连接。奇怪但真实。
我希望第二个程序实例无法开始侦听与第一个实例相同的端口。