OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
今天在练习socket模拟一个http请求的时候遇到以下问题:

源码如下
import socket
import threading
def request(new_socket):
# 1. 头部信息
response = 'HTTP/1.1 200 OK\r\n'
response += '\r\n'
# 2. 返回头部信息+内容
response += 'Hello World'
new_socket.send(response.encode('utf-8'))
new_socket.close()
if __name__ == '__main__':
# 1.创建基于TCP协议的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.端口绑定
tcp_socket.bind(('localhost', 8888))
# 3.设置监听模式
tcp_socket.listen(128)
while True:
# 4.收到新的请求套接字
new_socket, addr = tcp_socket.accept()
# print("==========>>",isinstance(new_socket,socket.socket))
# 5. 请求信息
data = new_socket.recv(1024)
# print(data)
# 6.使用线程进行处理
t = threading.Thread(target=request,args=(new_socket,)).start()
#关闭循环内套接字
new_socket.close()
# 关闭监听套接字
tcp_socket.close()
提示看到是问题在第14行,检查应该是在循环内部在子线程 t
结束前就关闭了 new_socket
造成的。
t
new_socket
while True:
# 4.收到新的请求套接字
new_socket, addr = tcp_socket.accept()
# print("==========>>",isinstance(new_socket,socket.socket))
# 5. 请求信息
data = new_socket.recv(1024)
# print(data)
# 6.使用线程进行处理
t = threading.Thread(target=request,args=(new_socket,)).start()
#关闭循环内套接字
new_socket.close() # 看这里
# 关闭监听套接字
tcp_socket.close()
解决办法
线程 t
添加 join()
方法,在线程t执行完毕后再关闭循环的 new_soket
t
join()
new_soket
import socket
import threading
def request(new_socket):
# 1. 头部信息
response = 'HTTP/1.1 200 OK\r\n'
response += '\r\n'
# 2. 返回头部信息+内容
response += 'Hello World'
new_socket.send(response.encode('utf-8'))
new_socket.close()
if __name__ == '__main__':
# 1.创建基于TCP协议的套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.端口绑定
tcp_socket.bind(('localhost', 8888))
# 3.设置监听模式
tcp_socket.listen(128)
while True:
# 4.收到新的请求套接字
new_socket, addr = tcp_socket.accept()
# print("==========>>",isinstance(new_socket,socket.socket))
# 5. 请求信息
data = new_socket.recv(1024)
# print(data)
# 6.进行处理
t = threading.Thread(target=request,args=(new_socket,))
t.start()
#关闭循环内套接字
t.join() # 看这里
new_socket.close()
# 关闭监听套接字
tcp_socket.close()