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()