gpt4 book ai didi

Python套接字连接错误: OSError: [Errno 9] Bad file descriptor

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:06 41 4
gpt4 key购买 nike

我正在尝试用 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套接字连接错误: OSError: [Errno 9] Bad file descriptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58032200/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com