套接字 - 客户端/服务器 - 在二进制文件传输后发送字符串

时间:2016-09-07 15:25:04

标签: python sockets binaryfiles

我正在研究Python客户端/服务器脚本。我遇到的一个问题是试图告诉服务器我已经完成了发送文件。这是我的逻辑的一步一步:

  • 客户端连接到服务器&发送文件名。
  • 服务器告诉客户端发送文件。
  • 客户端发送文件,服务器将其保存在传递的名称下。
  • 客户端发送一个字符串(' EOF')告诉服务器它已完成发送文件。
  • 服务器向客户端发送一个字符串(' TRXOK'),传输正常。
  • 服务器执行一些操作并向客户端发送其他数据。
  • 服务器关闭文件/连接
  • 客户端根据收到的最新数据关闭连接并执行操作。

我遇到的问题是告诉服务器文件传输已完成。我发送EOF'但服务器并不了解它。当我发送文件名时,我将其发送为:

ClientSS.sendall(FileName.encode())

,服务器收到它:

FileName  = ClientSS.recv(1024).decode()

这是有效的,与我用于发送EOF字符串的方法相同。 该文件是二进制的,所以我只做一个:

Data = File.read(1024)
HostSS.sendall(Data)

并在服务器端:

RawData = ClientSS.recv(1024)

这也很有效。但是,以下代码并没有(没有找到EOF):

while True:                          #receive file
    try:
        RawData = ClientSS.recv(1024)
    except socket.error:
        TimerCount += 1              #increment timer count
        if TimerCount >= 5 :         #waited 1/2 sec, no activity so error out
            Ret = 'ERR_FILE_RECV'
            break
        continue
    EOFData = ''
    try:
        EOFData = RawData.decode().strip()
    except:
        pass
    if EOFData == 'EOF':           #Rec'd a EOF so we're done with file
        break
    WriteFile.write(RawData)        #write raw data to file

当我运行此代码时,文件将被传输并保存(与EOF字符串一起)。 EOF条件永远不会找到" EOF"。关于为什么上述代码片段没有捕获EOF的任何想法?

我用来发送文件的代码& EOF:

while True:                  #send the file
        Data = File.read(1024)
        if not Data:             #hit EOF, no more data
            break                #Exit file send loop
        HostSS.sendall(Data)
SendEOF = 'EOF'
HostSS.sendall(SendEOF.encode())

0 个答案:

没有答案