Python套接字编程 - 错误的文件描述符错误

时间:2015-02-13 09:08:52

标签: python sockets tcp

我试图创建一个简单的服务器,并在IDLE中不断收到以下错误:

  File "C:\Python27\lib\socket.py", line 202, in accept
sock, addr = self._sock.accept()
  File "C:\Python27\lib\socket.py", line 170, in _dummy
    raise error(EBADF, 'Bad file descriptor')
error: [Errno 9] Bad file descriptor

这是我的代码。我已经尝试了解原因,并且它与关闭其中一个插座然后再次尝试使用它有关,但我并没有真正理解我应该如何修复它。任何和所有的帮助表示赞赏。 :)

from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
port=10101
serverSocket.bind(('',port))
serverSocket.listen(5)
while True:
        print 'Ready to serve...'
        connectionSocket, addr = serverSocket.accept()
        try:
                message = serverSocket.recv(1024)
                filename = message.split()[1]
                f = open(filename[1:])
                outputdata = f.read()
                connectionSocket.send("HTTP/1.1 200 OK\r\n\n")
                for i in range(0, len(outputdata)):
                        connectionSocket.send(outputdata[i])
                connectionSocket.close()
        except IOError:
                connectionSocket.send('HTTP/1.1 404 File not found\r\n\n')
                connectionSocket.close()
                serverSocket.close()
serverSocket.close()

2 个答案:

答案 0 :(得分:1)

有几件事:

当用户27994550输入他的代码时,你想使用

 message = connectionSocket.recv(1024)

接收消息,而不是服务器套接字。

你的两个代码遗漏的另一件事是你不想打电话

serverSocket.close()
除非你整体关闭程序,否则在你的except函数中

。如果关闭服务器套接字,则在下次调用

时关闭
connectionSocket, addr = serverSocket.accept()

您将无法接受其他连接。希望这有帮助!

答案 1 :(得分:0)

您正在尝试使用“消息”变量数据,而不检查其是否为空。 我认为这可能是问题所在。

试试这个:

from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)
port=10101
serverSocket.bind(('localhost',port))
serverSocket.listen(5)
while True:
    print('Ready to server')
    connectionSocket, addr = serverSocket.accept()
    try:
                message = connectionSocket.recv(1024)
                if message != "": #Checking if empty
                    filename = message.split()[1]
                    f = open(filename[1:])
                    outputdata = f.read()
                    connectionSocket.send("HTTP/1.1 200 OK\r\n\n")
                    for i in range(0, len(outputdata)):
                        connectionSocket.send(outputdata[i])
                    connectionSocket.close()
    except IOError:
            connectionSocket.send('HTTP/1.1 404 File not found\r\n\n')
            connectionSocket.close()
            serverSocket.close()