Python套接字连接错误:OSError:[Errno 9]错误的文件描述符

Python套接字连接错误:OSError:[Errno 9]错误的文件描述符,python,sockets,Python,Sockets,我正在尝试用python编写一个客户机/服务器程序,它将接受多个连接并使用线程来管理它们。服务器和客户端都在运行,客户端将从服务器的“processClient”函数接收“欢迎”消息,这意味着正在建立连接并启动线程。但是,在欢迎消息失败后,连接对象上的任何后续接收或发送都会出现“OSError:[Errno 9]错误文件描述符”错误。我已经对错误进行了一些搜索,大多数问题似乎都是由于有人试图使用以前关闭的套接字或连接造成的,这里不应该是这种情况。有人知道错误的原因吗?运行python版本3.5.

我正在尝试用python编写一个客户机/服务器程序,它将接受多个连接并使用线程来管理它们。服务器和客户端都在运行,客户端将从服务器的“processClient”函数接收“欢迎”消息,这意味着正在建立连接并启动线程。但是,在欢迎消息失败后,连接对象上的任何后续接收或发送都会出现“OSError:[Errno 9]错误文件描述符”错误。我已经对错误进行了一些搜索,大多数问题似乎都是由于有人试图使用以前关闭的套接字或连接造成的,这里不应该是这种情况。有人知道错误的原因吗?运行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))

对于任何一个偶然发现这个问题的人来说:我最终解决了这个问题。服务器在尝试从连接读取数据之前没有等待来自客户端的输入,这触发了错误(错误消息对诊断此问题尤其没有帮助)。我重写了它以使用python选择器,而不是线程选择器,它包含非常方便的轮询功能,可以用来“暂停”直到有数据要读取。我本可以自己将其内置到程序中,但既然已经有了语言功能,为什么还要这么做呢?

对于其他偶然发现这一点的人来说:我终于解决了这个问题。服务器在尝试从连接读取数据之前没有等待来自客户端的输入,这触发了错误(错误消息对诊断此问题尤其没有帮助)。我重写了它以使用python选择器,而不是线程选择器,它包含非常方便的轮询功能,可以用来“暂停”直到有数据要读取。我本可以自己将其内置到程序中,但既然已经有了语言功能,为什么还要这样做呢?

看起来您总是需要在终端中键入“time”来保持连接,或者在任何其他输入时终止连接。这就是您发送来测试这个的内容吗?看起来您总是需要在终端中键入“time”来保持连接,或者在任何其他输入上终止连接。这就是你要测试的吗?