Я пытаюсь заставить веб-страницу фляги взаимодействовать с сокет-сервером. На данный момент у меня есть функция для отправки данных и функция для получения данных. Когда сервер принимает соединение, он создает новый объект соединения и сохраняет эти объекты в списке. Затем он создает поток для ввода или вывода для отправки или получения данных (веб-сайт по сути является устройством ввода). однако при вызове 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] Была предпринята операция над чем-то, что не является сокетом