客户端未接收到Python数据

2 投票
2 回答
6507 浏览
提问于 2025-04-17 05:16

我刚开始学习Python,有个基本的问题:网络套接字连接的客户端能接收数据吗?在我的问题中,客户端是发起连接的一方,这点可能很明显,但我想说清楚。我之所以问这个,是因为我有一个服务器和客户端(都是用Python写的),这个服务器可以从客户端接收文件,运行得很好。但是我找不到一个例子,能让客户端接收文件。Python一直告诉我管道已经断了,我怀疑是因为在客户端我使用了这一行代码:data = mysocket.recv(1024)。我猜测客户端没有看到任何数据流动,因此关闭了与服务器的连接。服务器就把它当成了断开的管道。下面是服务器和客户端的代码。

服务器:

 #libraries to import
 import socket
 import os
 import sys
 import M2Crypto as m2c

 #information about the server the size of the message being transferred
 server_address = '10.1.1.2'
 key_port = 8888
 max_transfer_block = 1024

 FILE = open("sPub.pem","r")

 #socket for public key transfer
 keysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 keysocket.bind((server_address, key_port))
 keysocket.listen(1)

 while 1:
         conn, client_addr = keysocket.accept()
         print 'connected by', client_addr
         #sends data to the client
         data = FILE.read()
         keysocket.sendall(data)
 keysocket.close()

客户端:

 # the specified libraries
 import socket
 import M2Crypto as m2c
 #file to be transferred
 FILE = open("test.txt", "r")
 #address of the server
 server_addr = '10.1.1.2'
 #port the server is listening on
 dest_port = 8888

 data = FILE.read()


 #Creates a socket for the transfer
 mysocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
 mysocket.connect( (server_addr, dest_port) )

 data = mysocket.recv(1024)
 print data
 #creates a new file to store the msg
 name = "serverPubKey.pem"

 #opens the new file and writes the msg to it
 FILE = open (name, "w")
 FILE.write(data)


 #closes the socket.
 mysocket.close()

如果能帮我解决这个问题,我将非常感激。谢谢!

2 个回答

1

在这种应用中,有时候跳过一些底层的细节,直接使用socket.makefile这个更高级的接口会更方便。

在客户端关闭的地方,把:

data = mysocket.recv(1024)

替换成:

f = mysocket.makefile('rb')
data = f.read(1024)           # or any other file method call you need

ftplib的源代码展示了在实际代码中如何做到这一点。

0

另外,补充一下之前的评论,有时候一个好的测试方法是多次重复接收数据。因为一次接收服务器发送的信息成功的几率其实不大。

可以像这样做:

nreceive = True#nreceive = Not Received
ticks = 0
f = None
while nreceive and ticks < 101:#try to get the info 100 times or until it's received
    ticks+=1
    try:
        f = mysocket.makefile('rb')
        if not f == None:
            nreceive = False
    except:
        pass
data = f.read(1024)

撰写回答