python3编写服务器时出现"io.BufferedReader' object has no attribute 'decode'的错误解决办法

问题描述:python3编写服务器时出现"io.BufferedReader' object has no attribute 'decode'报错

 

原因:就是文件操作没做好,file.open()完,没有file.read(),因此没有加载数据

代码如下:

def handleClient(clientSocket):

    requestHeaderLines = recvDate.splitlines()
    for line in requestHeaderLines:
        print(line)

    httpRequestMethodLine = requestHeaderLines[0]

    getFileName = re.match("[^/]+(/[^ ]*)",httpRequestMethodLine.decode("UTF-8")).group(1)
    print("file name is  ===> %s"%getFileName)

    if "/" == getFileName:
        getFileName = documentRoot + "/index.html"
        print("try1 filename ====>%s"%getFileName)
    else:
        getFileName = documentRoot + getFileName

    print("file2 name is +++2> %s"%getFileName)

    try:
        f = open(getFileName, "rb")
        print("*"*10)
        print(f)
    except IOError:
        responseHeaderLines = "HTTP/1.1 404 not found \r\n"
        responseHeaderLines += " \r\n"
        responseBody = "===sorry,file not found==="
    else:
        responseHeaderLines = "HTTP/1.1 200 ok\r\n"
        response_headers = "Server: My server\r\n"

        responseBody = f.decode("utf-8")


    response = responseHeaderLines + response_headers + "\r\n" + responseBody
    clientSocket.send(bytes(response,"utf-8"))
    clientSocket.close()


if __name__ == "__main__":

    serverSoket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serverSoket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)
    serverSoket.bind(("",8005))
    serverSoket.listen(128)

    while True:
        clientSocket, clientAddr = serverSoket.accept()
        print("[%s, %s]用户连接上了" % clientAddr)
        clientP = Process(target=handleClient, args=(clientSocket,))
        clientP.start()
        clientSocket.close()

运行结果报错如下

File "G:\学习python\web_study\静态web.py", line 44, in handleClient
    responseBody = f.decode("utf-8")

AttributeError: '_io.BufferedReader' object has no attribute 'decode'

 也就是说f文件不能够解码,第一想法是没有读到文件,但是检查运行结果发现已经打印了文件的地址”<_io.BufferedReader name='./html/index.html'>“,没多想。后来查到这个网页,顿时茅塞顿开。

https://cloud.tencent.com/developer/ask/145732/answer/254729

解决办法:

将上述代码进行简单修改就可以了

responseBody = f.read().decode("utf-8")
如果我没有解释清楚,可以加我微信,一块讨论

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值