即使在解码为字节字符串

时间:2017-11-29 09:11:17

标签: python sockets types typeerror

您好我遇到类型错误的问题我无法摆脱。 我已经构建了一个名为processA.py的服务器和一个客户端processB.py 我启动服务器调用processA并启动它 我启动客户端调用processB并启动它 现在我输入要通过套接字发送的文件的名称。 图像必须与程序位于同一文件夹中。 您可以使用下面的示例代码来重现错误。

我选择:lena.jpg

我在processA.py中的第15行收到错误:

  

sock.send(“EXISTS”+ str(os.path.getsize(filenameByte)))TypeError:a   类似字节的对象是必需的,而不是'str'

processA.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()

processB.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()

1 个答案:

答案 0 :(得分:0)

我找到了答案。在python 3中,你总是在发送时将你的字符串转换为字节字符串。在将它们发送到接收器之后,您必须再次对它们进行解码,这必须为空洞通信完成,这就是错误总是出现在同一模块中的原因。

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()

processB.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()