我正在尝试创建一个工具来在python 3中传输二进制文件,并在服务器端遇到了一个奇怪的问题。在服务器代码中,您将看到我注释掉了一行,它将从客户端接收的数据打印到屏幕上。
注释掉这一行后,我收到错误TypeError:参数应该是字节,缓冲区或ASCII字符串,而不是"NoneType",并且二进制文件显然已损坏。
如果我从服务器代码中取消注释打印语句,则文件将按预期传输,并且二进制文件将完好无损地接收到。我尝试在 self.data 上检查 None ,但是,从未检测到 None 类型。
我完全困惑为什么"print(self.data)"行允许代码执行而没有错误。任何想法都值得赞赏。
接收文件的服务器:
import socketserver, argparse, sys, binascii
class tcpReceiver(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(4096).strip()
if self.data.startswith(b"snd:"):
self.file = self.data.split(b":")[1]
print ("Receiving File: " + str(self.file, "utf-8"))
with open(self.file, 'wb') as f:
while self.data:
self.data = self.request.recv(4096).strip()
#print (self.data)
if len(self.data) % 2 == 0:
f.write(binascii.unhexlify(self.data))
else:
f.write(binascii.unhexlify(bytearray(self.data).append(0)))
print ("File Received.")
return
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("port", action="store", help="port", type=int)
args = parser.parse_args() # Declare argumnets object to args
host, port = "", args.port
server = socketserver.TCPServer((host, port), tcpReceiver)
server.serve_forever()
要发送文件的客户端:
import socket
import sys, os, argparse, binascii
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("host", action="store", help="remote host", type=str)
parser.add_argument("port", action="store", help="remote port", type=int)
parser.add_argument("file", action="store", help="file to send", type=str)
args = parser.parse_args() # Declare argumnets object to args
HOST, PORT = args.host, args.port
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
path, file = os.path.split(args.file)
sock.sendall(b"snd:" + bytes(file, "utf-8"))
with open(args.file, 'rb') as f:
dat = f.read(4096)
while (dat):
if dat:
sock.sendall(binascii.hexlify(dat))
dat = f.read(4096)
sock.close()
append
不在位
bytearray(self.data).append(0)
:假设这返回一个值是错误的。实际上,它只是将0
附加到数组中,什么也不返回(我也真的很鄙视这一点,尤其是对于代码高尔夫)。相反,请对 else
子句执行此操作:
array = bytearray(self.data)
array.append(0)
f.write(binascii.unhexlify(array))
你也可以做f.write(binascii.unhexlify(bytearray(self.data) + [0]))
我不确定。