天天看點

OSError: [WinError 10038] 在一個非套接字上嘗試了一個操作。今天在練習socket模拟一個http請求的時候遇到以下問題:

OSError: [WinError 10038] 在一個非套接字上嘗試了一個操作。

今天在練習socket模拟一個http請求的時候遇到以下問題:

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

造成的。

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

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