Python 进程终止后未释放端口的线程上的套接字服务器
以下代码在线程上运行套接字服务器。客户端套接字向服务器发送“client:hello”,服务器套接字接收并回复“server:world”Python 进程终止后未释放端口的线程上的套接字服务器,python,multithreading,sockets,Python,Multithreading,Sockets,以下代码在线程上运行套接字服务器。客户端套接字向服务器发送“client:hello”,服务器套接字接收并回复“server:world” import socket import threading def server(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('127.0.0.1', 12345)) sock.listen(1) req, addr = so
import socket
import threading
def server():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 12345))
sock.listen(1)
req, addr = sock.accept()
print req.recv(1024)
req.sendall('server: world')
def client():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 12345))
sock.sendall('client: hello')
print sock.recv(1024)
def main():
t = threading.Thread(target=server)
t.start()
client()
if __name__ == '__main__':
main()
它第一次运行正常,但从第二次开始,如果您没有等待服务器释放套接字的几秒钟,并且如果您在Linux机器或Mac上尝试此操作(Windows无法获得),您将遇到以下错误:
Traceback (most recent call last):
File "socket_send_receive.py", line 24, in <module>
main()
File "socket_send_receive.py", line 21, in main
client()
File "socket_send_receive.py", line 14, in client
sock.connect(('127.0.0.1', 12345))
File "<string>", line 1, in connect
socket.error: [Errno 111] Connection refused
Exception in thread Thread-1:
Traceback (most recent call last):
File "/home/cxuan/python/2.6/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/home/cxuan/python/2.6/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "socket_send_receive.py", line 6, in server
sock.bind(('127.0.0.1', 12345))
File "<string>", line 1, in bind
error: [Errno 98] Address already in use
回溯(最近一次呼叫最后一次):
文件“socket\u send\u receive.py”,第24行,在
main()
文件“socket\u send\u receive.py”,第21行,在main中
客户()
客户端第14行的文件“socket\u send\u receive.py”
插座连接(('127.0.0.1',12345))
文件“”,第1行,在connect中
socket.error:[Errno 111]连接被拒绝
线程1中的异常:
回溯(最近一次呼叫最后一次):
文件“/home/cxuan/python/2.6/lib/python2.6/threading.py”,第532行,位于引导程序内部
self.run()
文件“/home/cxuan/python/2.6/lib/python2.6/threading.py”,第484行,运行中
自我目标(*自我参数,**自我参数)
服务器中第6行的文件“socket\u send\u receive.py”
袜子装订('127.0.0.1',12345))
文件“”,第1行,处于绑定状态
错误:[Errno 98]地址已在使用中
我想了解为什么会发生这种情况,以及是否有可能真正解决问题,或者应该采用什么样的最佳做法
我知道,由于stackoverflow上的其他帖子,使用这个选项已经是一个解决办法
socket.SO_REUSEADDR
当套接字关闭时,它将处于一种称为
state\u WAIT
的状态(请参阅)。当套接字处于此状态时,除非在套接字上设置了SO\u REUSEADDR
选项,否则其他任何人都不能使用相同的地址(ip号码/端口对)
如需有关TCP工作原理的更多信息,请参阅TCP上的。当套接字关闭时,它将处于名为
状态\u WAIT
的状态(请参阅)。当套接字处于此状态时,除非在套接字上设置了SO\u REUSEADDR
选项,否则其他任何人都不能使用相同的地址(ip号码/端口对)
如需有关TCP工作原理的更多信息,请参阅TCP上的。回答不错!它提供了很多见解。穿线是一种转移注意力的方法。最初我将客户机和服务器代码分成两个文件,并在两个进程中运行它们。服务器立即释放套接字,但当像上面那样将它们放在一起时,并没有那么快发生。然而,测试仅在Mac电脑上进行。在阅读了你的答案后,我在Linux机器上尝试了它,同样的错误也发生了!有趣的是,不同平台上的套接字的行为略有不同。虽然很微妙,但如果代码没有按照主流原则仔细编写,可能会导致问题。回答不错!它提供了很多见解。穿线是一种转移注意力的方法。最初我将客户机和服务器代码分成两个文件,并在两个进程中运行它们。服务器立即释放套接字,但当像上面那样将它们放在一起时,并没有那么快发生。然而,测试仅在Mac电脑上进行。在阅读了你的答案后,我在Linux机器上尝试了它,同样的错误也发生了!有趣的是,不同平台上的套接字的行为略有不同。虽然很微妙,但如果代码没有按照主流原则仔细编写,可能会导致问题。