OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。

OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。

今天在练习socket模拟一个http请求的时候遇到以下问题:

OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。_第1张图片

源码如下

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

你可能感兴趣的:(OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。)