Ошибка подключения к сокету Python: OSError: [Errno 9] Неверный дескриптор файла - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь написать клиент-серверную программу на python, которая будет принимать несколько соединений и управлять ими, используя потоки.Сервер и клиент оба работают, и клиент получит «приветственное» сообщение от функции «processClient» серверов, что означает, что соединение установлено и поток запущен.Однако любой последующий прием или отправка объекта соединения после сообщения приветствия завершается с ошибкой «OSError: [Errno 9] Bad file descriptor».Я провел некоторый поиск ошибки, и большинство проблем, кажется, является результатом того, что кто-то пытается использовать сокет или соединение, которое было ранее закрыто - чего не должно быть здесь.Кто-нибудь знает, что может быть причиной ошибки?Запуск Python версии 3.5.2

Код сервера:

#!/usr/bin/env python3


import socket
import sys
import os
import datetime
import threading
import random

PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

def processClient(conn, id):
        welcome = "Hello, you are client number " +  str(id)
        welcome = bytes(welcome, 'utf-8')
        conn.sendall(welcome)
        while True:
                data = conn.recv(1024)
                print(rpr(data))
                time = str(datetime.datetime.now())
                arr = bytes(time, 'utf-8')
                if data == b'time':
                        conn.sendall(arr)
                elif data == b'':
                        conn.close()
                        return
                else:
                        temp = data.decode("utf-8")
                        temp = temp.upper()
                        temp = bytes(temp, 'utf-8')
                        conn.sendall(temp)

try:
         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

except:
        print("unable to create socket connection, shutting down.")
        quit()


s.bind(('0.0.0.0', PORT))
s.listen()
sys.stdout.write("Server is running \n")

runningThreads = []
threadID = 0
while True:
        conn, addr = s.accept()

        with conn:
                #conn.setblocking(False)
                print('Connected by', addr)
                threadID += 1
                threadTemp = threading.Thread(target = processClient, args=(conn, threadID))
                threadTemp.start()
                runningThreads.append(threadTemp)
        for t in runningThreads:
                if not t.isAlive():
                        # get results from thtead
                        t.handled = True
                        threadID -= 1
                else:
                        t.handled = False
        runningThreads = [t for t in runningThreads if not t.handled]

Код клиента:

#!/usr/bin/env python3

import socket
import sys
import os
import datetime
HOST = 0

while HOST == 0 or HOST == "":
        HOST = input("Please enter host IP: ")


PORT = 65432        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        data = s.recv(1024)
        print(repr(data))
        while True:
                inputString = input("Please input a string: ")
                temp = bytes(inputString, 'utf-8')
                s.sendall(temp)
                if inputString == "":
                        quit()

                data = s.recv(1024)
                if data:
                        print(rpr(data))

1 Ответ

0 голосов
/ 26 сентября 2019

для всех, кто сталкивается с этим: я, наконец, решил проблему.Сервер не ожидал ввода от клиента, прежде чем он попытался прочитать данные из соединения, что вызвало ошибку (сообщение об ошибке было особенно бесполезным при диагностике этой проблемы).Я переписал это, чтобы использовать селекторы Python, а не селекторы потоков, которые включают очень удобную функцию опроса, которую можно использовать для «приостановки» до тех пор, пока не будут прочитаны данные.Я мог бы встроить это в программу сам, но зачем это делать, если уже есть языковая функция, которая делает это для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...