【问题标题】:Python error TypeError: argument should be bytes, buffer or ASCII string, not 'NoneType'Python 错误 TypeError:参数应该是字节、缓冲区或 ASCII 字符串,而不是“NoneType”
【发布时间】:2017-10-24 23:48:11
【问题描述】:

我正在尝试创建一个工具来在 python 3 中传输二进制文件并在服务器端遇到一个奇怪的问题。在服务器代码中,您将看到我注释掉了一行,它将从客户端接收到的数据打印到屏幕上。

注释掉这一行后,我收到错误 TypeError: argument should be bytes, buffer or ASCII string, not '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()

【问题讨论】:

    标签: python python-3.x typeerror socketserver binascii


    【解决方案1】:

    append 不在位

    bytearray(self.data).append(0): 你错误地假设 this 返回一个值。实际上,它只是将0 附加到数组并且什么都不返回(我也很鄙视这一点,尤其是对于代码高尔夫)。相反,对else 子句执行此操作:

    array = bytearray(self.data)
    array.append(0)
    f.write(binascii.unhexlify(array))
    

    你也可以只做f.write(binascii.unhexlify(bytearray(self.data) + [0]))我不确定。

    【讨论】:

    • 产生错误:binascii.Error: Non-hexadecimal digit found I replace array.append(0) with array += b"0" 有效,但传输的 EXE 文件仍然损坏,并且不会执行。如果我允许打印代码(self.data),那么文件会正确传输并且可以执行文件。这是完全奇怪的。我会留下它,但它会减慢文件传输速度。
    • @user4573 试试+= b"\u000"?
    • 无论如何,关于文件的处理方式,我帮不了你;我不知道它是如何工作的。我只能帮你解释为什么会出现NoneType 错误
    • 导致:binascii.Error: Odd-length string
    • 取消注释#print (self.data) 时不会产生NoneType 错误。我不知道它如何在结果数据中发挥任何作用。不过感谢您的帮助,不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2015-02-28
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多