即使在解码为字节字符串时,使用套接字通信也会出现类型错误

2024-09-29 23:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

你好,我有一个类型错误的问题,我不能摆脱。 我已经建立了一个名为过程a.py还有一个客户过程b.py 我启动服务器调用processA,它就启动了 我启动客户端调用processB,它就启动了 现在我输入要通过套接字发送的文件的名称。 图像必须与程序位于同一文件夹中。 您可以使用下面的示例代码来再现错误。你知道吗

我选择:李娜.jpg你知道吗

我在我的第15行有个错误过程a.py地址:

sock.send("EXISTS" + str(os.path.getsize(filenameByte))) TypeError: a bytes-like object is required, not 'str'

你知道吗过程a.py ''' 创建于2017年11月29日

@author: Poor Student
'''
import numpy 
import socket
import threading
import os

def RtrFile(name, sock):
    filenameByte = sock.recv(1024)
    filenameStr = filenameByte.decode('ascii')
    if os.path.isfile(filenameStr):
        sock.send("EXISTS" + str(os.path.getsize(filenameByte)))
        userResponse = sock.recv(1024)
        if userResponse[:2] == 'OK':
            with open(filenameByte, 'rb') as f:
                bytesToSend = f.read(1024)
                sock.send(bytesToSend)
                while bytesToSend != "":
                    bytesToSend = f.read(1024)
                    sock.send(bytesToSend)
    else:
        sock.send("ERR")

    sock.close()

def Main():
    host = "127.0.0.1"
    port = 5000

    s = socket.socket()
    s.bind((host,port))
    s.listen(5)

    print("server started.")

    while True:
        c, addr =s.accept()
        print("client connected ip:< " + str(addr) +">")
        t = threading.Thread(target = RtrFile, args=("rtrThread",c))
        t.start()
    s.close()
if __name__ == "__main__":
    Main()

你知道吗过程b.py你知道吗

    '''
Created on 29 Nov 2017

@author: Poor Student
'''
import socket

def Main():
    host = "127.0.0.1"
    port = 5000

    s = socket.socket()
    s.connect((host,port))

    filename = input("Filename? -> ")

    if filename != "q":
        s.send(filename.encode())
        data = s.recv(1024)
        if data[:6] == "EXISTS":
            filesize = int(data[6:])
            message = input("File Exists, " +str(filesize) + "Bytes, download? (Y/N)? ->")
            if message == "Y" or message =="y":
                s.send("OK")
                f = open("new_" + filename, "wb")
                data = s.recv(1024)
                totalRecv = len(data)
                f.write(data)
                while totalRecv < filesize:
                    data = s.recv(1024)
                    totalRecv += len(data)
                    f.write(data)
                    print("(0:.f)".format((totalRecv)/float(filesize))*100 +"done")
                print("Download Complete")
        else:
            print("File does not exists")#
    s.close()
if __name__ == "__main__":
    Main()

Tags: pyimportsenddataifosmain过程
1条回答
网友
1楼 · 发布于 2024-09-29 23:21:57

我找到了答案。在Python3中,在发送字符串时,您总是可以将字符串转换为字节字符串。发送到接收器后,你必须再次解码它们,这必须为孔通信完成,这就是为什么错误总是出现在同一个模块中。你知道吗

Process A:
'''
Created on 29 Nov 2017

@author: Happy student
'''
import numpy 
import socket
import threading
import os
from idlelib.IOBinding import encoding

def RtrFile(name, sock):
    filenameByte = sock.recv(1024)
    filenameStr = filenameByte.decode('ascii')
    print("FilenameStr",filenameStr)
    if os.path.isfile(filenameStr):
        print("Type:",type(filenameByte))
        print(os.path.getsize(filenameByte))#

        sendStr = "EXISTS" + str(os.path.getsize(filenameByte))

        #Convert the string to byte because otherwise it will not be send
        sock.send((sendStr.encode(encoding)))
        userResponse = sock.recv(1024)

        #the Responce will be received in byte and will be converted to a string to make it checkable
        userResponceStr = userResponse.decode('ascii')

        if userResponceStr[:2] == 'OK':
            with open(filenameByte, 'rb') as f:
                bytesToSend = f.read(1024)
                sock.send(bytesToSend)
                while bytesToSend != "":
                    bytesToSend = f.read(1024)
                    sock.send(bytesToSend)
        else:
            print("User response not known")
    else:
        sendStr = "ERR"
        sock.send(sendStr.encode(encoding))

    sock.close()

def Main():
    host = "127.0.0.1"
    port = 5000

    s = socket.socket()
    s.bind((host,port))
    s.listen(5)

    print("server started.")

    while True:
        c, addr =s.accept()
        print("client connected ip:< " + str(addr) +">")
        t = threading.Thread(target = RtrFile, args=("rtrThread",c))
        t.start()
    s.close()
if __name__ == "__main__":
    Main()

你知道吗过程b.py你知道吗

'''
Created on 29 Nov 2017

@author:  Happy student
'''
import socket
from idlelib.IOBinding import encoding

def Main():
    host = "127.0.0.1"
    port = 5000

    s = socket.socket()
    s.connect((host,port))

    filename = input("Filename? -> ")

    if filename != "q":
        s.send(filename.encode())
        data = s.recv(1024)
        dataStr = data.decode('ascii')
        if dataStr[:6] == "EXISTS":
            filesize = int(dataStr[6:])
            message = input("File Exists, " +str(filesize) + "Bytes, download? (Y/N)? ->")
            if message == "Y" or message =="y":
                sendStr = "OK"
                s.send(sendStr.encode(encoding))
                #create new file new_filename and 
                f = open("new_" + filename, "wb")
                data = s.recv(1024)
                totalRecv = len(data)
                f.write(data)
                while totalRecv < filesize:
                    data = s.recv(1024)
                    totalRecv += len(data)
                    f.write(data)
                print("Download Complete")
            else:
                print(message +"was not noticed")
                exit()
        else:
            print("File does not exists")#
    s.close()
if __name__ == "__main__":
    Main()

相关问题 更多 >

    热门问题