Python не распознает параметр как сокет - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь заставить веб-страницу фляги взаимодействовать с сокет-сервером. На данный момент у меня есть функция для отправки данных и функция для получения данных. Когда сервер принимает соединение, он создает новый объект соединения и сохраняет эти объекты в списке. Затем он создает поток для ввода или вывода для отправки или получения данных (веб-сайт по сути является устройством ввода). однако при вызове socket.recv внутри протектора Python возвращает «OSError: [WinError 10038] Операция была предпринята для чего-то, что не является сокетом».

Я добавил операторы печати, чтобы проверить тип параметра, переданного в функцию приема, и он возвращается, однако при попытке вызвать socket.recv () в следующей строке он возвращает попытку выполнить операцию с чем-то, что не является розетка.

import socketserver
import threading

HEADERSIZE = 10

bufferFull = False
buffer = ""


def recieveData(sock):
    full_msg = ""
    new_msg = True
    sock = sock
    print(type(sock))
    while True:

        msg = sock.recv(16)
        if new_msg:
            #print(f"new message length: {msg[:HEADERSIZE]}")
            msglen = int(msg[:HEADERSIZE])
            new_msg = False

        full_msg += msg.decode("utf-8")

        if len(full_msg) - HEADERSIZE == msglen:
            #print("full message recieved")
            #print(full_msg[HEADERSIZE:])
            return full_msg[HEADERSIZE:]
            new_msg = True
            full_msg = ''
            break

def inputThread(id):
    #print(connections[id].req)
    #print(type(connections[id].req))

    while True:

        data = recieveData(connections[id].req)

        buffer = data
        bufferFull = True



#lists to keep track of the connections and the treads
connections = []
threads = []

class Con:
    def __init__(self, req, type, id):
        self.req = req
        self.type = type
        self.id = id


class MyTCPHandler(socketserver.BaseRequestHandler):


    def handle(self):
        #when a request is received create a new connection object storing
        #the request itself, the type sent initially with the request (INPUT or OUTPUT)
        #and the ID of the connection gotten from the length of the connections list
        req = self.request
        type = recieveData(self.request)
        id = len(connections)
        print("REQ: " + str(req))
        print("TYPE: " + str(type))
        print("ID: " + str(id))

        c = Con(req, type, id)
        connections.append(c)

        if(connections[id].type == "INPUT"):
            t = threading.Thread(target=inputThread, args=(id,))
            threads.append(t)
            t.start()
        else:
            t = threading.Thread(target=outputThread, args=(id,))
            threads.append(t)
            t.start()


if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    # Create the server, binding to localhost on port 9999
    server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)

    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

Я ожидаю, что функция продолжит работу до получения сообщения, затем установлю буфер равным этому сообщению и изменим значение bufferFull bool на True

на самом деле я получаю OSError: [WinError 10038] Была предпринята операция над чем-то, что не является сокетом

...