Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 进程终止后未释放端口的线程上的套接字服务器_Python_Multithreading_Sockets - Fatal编程技术网

Python 进程终止后未释放端口的线程上的套接字服务器

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

以下代码在线程上运行套接字服务器。客户端套接字向服务器发送“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 = 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机器上尝试了它,同样的错误也发生了!有趣的是,不同平台上的套接字的行为略有不同。虽然很微妙,但如果代码没有按照主流原则仔细编写,可能会导致问题。