Python ';socket.error:[Errno 9]错误的文件描述符';当我运行我的客户

Python ';socket.error:[Errno 9]错误的文件描述符';当我运行我的客户,python,python-2.7,sockets,errno,Python,Python 2.7,Sockets,Errno,当我运行客户端时,服务器崩溃 它说: Traceback (most recent call last): File "C:/Users/Or/PycharmProjects/2.6/cyber.py", line 17, in <module> data = client_socket.recv(1024) File "C:\Python27\lib\socket.py", line 174, in _dummy raise

当我运行客户端时,服务器崩溃

它说:

Traceback (most recent call last):
      File "C:/Users/Or/PycharmProjects/2.6/cyber.py", line 17, in <module>
        data = client_socket.recv(1024)
      File "C:\Python27\lib\socket.py", line 174, in _dummy
        raise error(EBADF, 'Bad file descriptor')
    socket.error: [Errno 9] Bad file descriptor
客户:

import socket

my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 8820))

theData = raw_input("enter command")
options = ['TIME', 'NAME', 'RAND', 'EXIT']
for z in options:
    if theData == z:
        my_socket.send(theData)
        data = my_socket.recv(1024)
        print data
    else:
        theData = raw_input("enter a real command")

我该怎么办?

服务器中的下一行
会阻塞
,直到客户端连接:

(client_socket, client_address) = server_socket.accept()
客户端连接后,服务器将执行以下操作:

  .... = client_socket.close()
 client_socket.recv(1024)
然后您的服务器执行以下操作:

  .... = client_socket.close()
 client_socket.recv(1024)
那是行不通的

我该怎么办

删除此行:

EXIT = client_socket.close()
您的代码还有几个其他问题:

1) 您不知道
send()
实际将发送多少数据:

套接字.发送(字节[,标志])

应用程序负责检查所有数据是否已发送; 如果只传输了部分数据,则应用程序需要 尝试传递剩余的数据。

换句话说,send()不一定能够一次性发送整个消息,因此send()返回实际发送的字节数。您可以使用
sendall()
来改善该问题

2) 但是,无论是
send()
还是
sendall()
您都不知道数据是以10个数据块、5个数据块还是全部以1个数据块的形式发送的,因此必须使用循环才能
recv()
整个消息:

data = []

while True:
    chunk = my_socket.recv()
    if not chunk: break  #When the other side closes the socket, chunk = ''
    data.append(chunk)

all_data = ''.join(data)
当另一侧关闭套接字时,
recv()
将返回一个空白字符串

3) 现在最重要的是:

data = client_socket.recv(1024)
服务器必须在循环中使用
recv()
,以确保从客户端读取整个消息:

data = []

while True:
    chunk = client_socket.recv()
    if not chunk: break  #When the other side closes the socket, chunk = ''
    data.append(chunk)

all_data = ''.join(data)

但是读取循环如何知道何时读取了所有数据?请注意,如前所述,当另一端关闭套接字时,循环终止,导致
recv()
返回一个空白字符串,从而终止while循环。但是,在您的情况下,客户端在其
send()
之后不会关闭套接字,因此服务器的
recv()
将永远不会返回空字符串,而while循环将继续尝试
recv()
——但客户端将已完成消息的发送并等待响应。死锁。

迭代关闭的端口。哪个套接字会话、服务器、客户端结束?永远都是服务器为什么?如何检查套接字错误或bug?不要在服务器上使用自动关闭(单个命令或消息)功能。定义关闭所有操作的关闭命令(例如:套接字已在使用)。