Python多线程返回错误的文件描述符?

Python多线程返回错误的文件描述符?,python,multithreading,python-2.7,Python,Multithreading,Python 2.7,因此,我正在制作一个聊天服务器(多么原始!),我正在使用多线程处理数据发送/接收,以及日志记录和(很快)服务器端命令。随便。。我运行服务器,到目前为止一切都很好。运行一个客户,嘿!它起作用了!重新启动客户,我就会得到 Exception in thread Thread-5: Traceback (most recent call last): File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner se

因此,我正在制作一个聊天服务器(多么原始!),我正在使用
多线程
处理数据发送/接收,以及日志记录和(很快)服务器端命令。随便。。我运行服务器,到目前为止一切都很好。运行一个客户,嘿!它起作用了!重新启动客户,我就会得到

Exception in thread Thread-5:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 810, in __bootstrap_inner
    self.run()
  File "C:\Users\Kuro\Desktop\PyChat\Server.py", line 51, in run
    s.listen(9999)
  File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
  File "C:\Python27\lib\socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor
在服务器上,但它仍然可以工作。客户端上还没有错误。再次运行客户端,就会发生这种情况;
[Errno 10061]无法建立连接,因为目标计算机主动拒绝它
。没有服务器输入/输出。 以下是服务器代码:

import socket
import threading
import sys
import os
import time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
IP = raw_input("IP to host the server on: ")
Port = 9340
dat = None
s.bind((IP,Port))

class recvdat(threading.Thread):
    def __init__(self, TID, TN):
        threading.Thread.__init__(self)
        self.TID = TID
        self.TN = TN
    def run(self):
        global dat, conn
        while True:
            try:
                dat = conn.recv(1048)
            except:
                dat = None
                s.close()
                break
            if dat == "/exit" or None:
                s.close()
                break
            else:
                print dat
                chtlg.write(dat)
                dat = None


class senddat(threading.Thread):
    def __init__(self, TID, TN):
        threading.Thread.__init__(self)
        self.TID = TID
        self.TN = TN
    def run(self):
        pass

class acconn(threading.Thread):
    def __init__(self, TID, TN):
        threading.Thread.__init__(self)
        self.TID = TID
        self.TN = TN
    def run(self):
        global conn, act, ACTID
        s.listen(9999)
        conn, addr = s.accept()
        rdt = recvdat(2,"rdt")
        ACTID = ACTID+1
        act = acconn(ACTID,"act")
        act.start()
        rdt.start()
        #print "Client Connected with IP "+addr

cwd = os.getcwd()
chtlg = open(cwd+"/ChatLog",'a')
ACTID = 0

act = acconn(ACTID,"act")

act.start()

while True:
    time.sleep(2.5)
    pass
是的,对于多线程程序来说,这是一个非常糟糕的借口,然而,它是非常不完整的,因为我埋头于制作客户端,并且我不经常使用类或多线程


任何帮助都将不胜感激

为什么要重新发明轮子(除非是为了学习);你见过@JamesMills吗?这不完全是为了学习,我的任务就是,在不断改进的同时重新发明轮子。我觉得任何需要它的人都可以使用简化版的
chatserver.py
,这样他们就可以真正理解它,而不仅仅是茫然地盯着它看,完全不知所措,同时保持它的轻量级和可定制性,但是,无论如何,谢谢!恐怕它会变得很轻;你还不明白什么?也许我能帮上什么忙?我现在没有时间调试您的多线程I/O程序;简而言之:错误的文件描述符错误是由于使用了不再有效且已连接到任何内容的文件描述符而导致的;i、 他们死了。那么你是说这与客户端有关,不是服务器的问题?这个错误来自于你的服务器实现;但这两种方法都可能有问题,因为套接字I/O并不是那么简单,而且有许多边缘情况需要处理。使用类似于或的框架