不管连接是被有意还是无意关闭,有时你想始终在同一个端口上运行套接字服务器。某些情况下,如果客户端程序需要一直连接指定的服务器端口,这么做就很有用,因为无需改变服务器端口。 1.11.1 实战演练 如果在某个端口上运行一个Python套接字服务器,连接一次之后便终止运行,就不能再使用这个端口了。如果再次连接,程序会抛出如下错误: Traceback (most recent call last): File "1_10_reuse_socket_address.py", line 40, in <module> reuse_socket_addr() File "1_10_reuse_socket_address.py", line 25, in reuse_socket_addr srv.bind( ('', local_port) ) File "<string>", line 1, in bind socket.error: [Errno 98] Address already in use 这个问题的解决方法是启用套接字重用选项SO_REUSEADDR。 创建套接字对象之后,我们可以查询地址重用的状态,比如说旧状态。然后,调用setsockopt()方法,修改地址重用状态的值。再按照常规的步骤,把套接字绑定到一个地址上,监听进入的客户端连接。在这个例子中,我们要捕获KeyboardInterrupt异常,这样按下Ctrl+C键后,Python脚本会终止运行,但不会显示任何异常消息。 代码清单1-10展示了如何重用套接字地址,如下所示: #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 1 # This program is optimized for Python 2.7. It may run on any # other Python version with/without modifications. import socket import sys def reuse_socket_addr(): sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) # Get the old state of the SO_REUSEADDR option old_state = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) print "Old sock state: %s" %old_state # Enable the SO_REUSEADDR option sock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 ) new_state = sock.getsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR ) print "New sock state: %s" %new_state local_port = 8282 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srv.bind( ('', local_port) ) srv.listen(1) print ("Listening on port: %s " %local_port) while True: try: connection, addr = srv.accept() print 'Connected by %s:%s' % (addr[0], addr[1]) except KeyboardInterrupt: break except socket.error, msg: print '%s' % (msg,) if __name__ == '__main__': reuse_socket_addr() 这个攻略的输出如下所示: $ python 1_10_reuse_socket_address.py Old sock state: 0 New sock state: 1 Listening on port: 8282 1.11.2 原理分析 你可以在一个终端窗口运行这个脚本,然后在另一个终端窗口中输入telnet localhost 8282,尝试连接这个服务器。关闭服务器程序后,还可以使用同一个端口再次连接。然而,如果你把设定SO_REUSEADDR的那行代码注释掉,服务器将不会再次运行脚本。
Python网络编程攻略——1.11 重用套接字地址
书名: Python网络编程攻略
作者: 萨卡尔
出版社: 人民邮电出版社
译者: 安道
出版年: 2014-12-1
页数: 170
定价: 45.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115372697