【发布时间】:2015-07-19 14:53:31
【问题描述】:
我正在尝试通过 Python 编码的对等聊天系统中的 tcp 套接字发送文件。接收套接字似乎不知道没有更多文件要接收。我可以让接收套接字不预测未到来的数据的唯一方法是关闭发送套接字(使用 socket.shutdown(socket.SHUT_WR))。但是,关闭发送套接字不是一种选择,因为我需要该套接字来发送其他消息。我首先尝试为文件发送/接收分配一个新端口,但失败了。现在,我尝试创建一个文件结尾“信号”,但它在接收端没有被识别为与 tcp 段分开的消息,所以我被卡住了。
发送代码如下:
def sendFile(self,filePath):
try:
f = open(filePath, 'rb')
print 'file opened'
for soc in self.allClients.keys():
try:
f = open(filePath, 'rb')
except:
print "File does not exist"
print 'Sending File: ' + filePath
l = f.read(1024)
while (l):
print 'Sending...'
soc.send(l)
l = f.read(1024)
soc.send('end')
f.close()
print 'File sent'
except:
print "File does not exist"
接收代码如下所示:
def receiveFile(self, ext, clientsoc):
f = open('receivedFile' + ext,'wb')
print "Receiving File..."
l = clientsoc.recv(1024)
while(l):
print "Receiving..."
if (l is not 'end'):
f.write(l)
print l + '\n'
l = clientsoc.recv(1024)
else:
break
f.close()
print "Received Fileeeeeooooo"
更奇怪的是,当我在对等程序之外使用此代码时,它仍然有效。任何帮助将不胜感激,我已经为此苦苦挣扎了两天。
【问题讨论】:
-
解决此问题的更典型方法是在开始发送文件之前发送文件的长度。这样,就不用担心您发送的文件是否包含文件结束信号。
标签: python sockets tcp sendfile