当前位置: 首页 > 知识库问答 >
问题:

如何在不关闭tcp套接字的情况下发送文件结束

蒋烨然
2023-03-14
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"

更奇怪的是,当我在对等程序之外使用它时,这段代码仍然有效。任何帮助都将非常感谢,我已经为这件事挣扎了两天了。

共有1个答案

宿景曜
2023-03-14

首先,不能将字符串与不是进行比较:

>>> a = "he"
>>> a + "llo" is "hello"
False

第二,TCP是一种流协议。recv最多为1024个字节,但可能更少,如果您从服务器发送两个字节,则可以将它们合并为一个recv。因此L不可能是“end”而是“文件结尾的最后一个字节”。并且如果检查“end”,则文件中不允许有“end”。最好的解决方案是首先发送文件的长度,然后发送和recvlengts字节。

ps:您可能希望在服务器端使用sendall

 类似资料:
  • 如果我不关闭套接字: 客户端没有输出。服务器从不发送消息,或者客户端从不接收消息。 有人知道发生这种情况的可能原因吗?客户端使用一个线程接收消息,一个线程发送消息。客户端套接字在主客户端线程中创建,因此接收者和发送者线程使用当前套接字进行通信。 提前谢了。

  • 请参阅下面的代码: 当程序启动时,我使用telnet连接localhost:8888,3秒后,服务器会杀死我,但当我使用netstat观看时,套接字状态仍然是ESTABLISHED。如果我删除了File()函数,套接字可以正常关闭。我怎样才能解决这个问题?

  • 我正在建立一个应用程序,用户将把他们的测试和作业和任何东西。我想知道我的应用程序是否有可能在测试前一周和一天发出通知? 我看到的到处都是firebase通知和push通知。 我不想要这些在线通知,我将需要应用程序发送他们自己离线。这可能吗?

  • 我使用来管理服务器端的套接字连接。如果服务器(tomcat)关闭,我如何确保任何活动的套接字连接被正确终止? 有好心的听众吗?或任何可以防止服务器关闭的拦截器,例如,如果在关闭期间有任何打开的套接字,则最多60秒;但同时关闭套接字,在关机期间不接受任何连接?

  • 我正在编写一个简单的文件客户端-服务器通信来使用TCP传输文件。我想使用python套接字编程来实现它的代码。我遵循这个例子。我想知道是否有可能控制数据包丢失和重传。例如,当数据包丢失时,我可以发送零字节大小的丢失,而不是重传实际丢失的段吗?

  • 我想关闭/终止/扔掉一个由一行代码创建的JPanel(因此它被完全终止,而不仅仅是隐藏并在后台作为