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?不要在服务器上使用自动关闭(单个命令或消息)功能。定义关闭所有操作的关闭命令(例如:套接字已在使用)。