EOFError при преобразовании строки в список - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть код, который работает на 2 хостах.Они обрабатывают некоторые фотографии.Когда хост1 получает сообщение, он отправляет некоторые фотографии на хост2 для обработки.Он также отправит список на host2 (он преобразует его в строку, а затем отправит).

import pickle
import time, threading

host = commands.getoutput("hostname -I")
port = 5005
i = 0
backlog = 5
BUFSIZE = 4096
queueList = []
start = []
end = []
l = threading.Lock()

def read_udp(s):
    data,addr = s.recvfrom(1024)
    global start
    if data.startswith('10.0.0'):
        print("received message:", data)
        data_split = data.split(" ")
        address = data_split[0]
        num = int(data_split[1])
        ipToTransfer = address
        l.acquire()
        transferList = queueList[-num:]
        del queueList[-num:]
        transferStart = start[-num:]
        del start[-num:]
        l.release()
        msg = pickle.dumps(transferStart)
        #udp_send('New Transfer', ipToTransfer)
        udp_send(msg, ipToTransfer)
        send_file(ipToTransfer, transferList) 
    else:
        recvStart = pickle.loads(data)
        print("start before add::: ", start)
        print("received::: ", recvStart)
        l.acquire()
        start = start + recvStart
        l.release()
        print("start after add::: ", start)

def udp_send(s, ip):
    UDP_IP = ip
    if(type(s) == str):
        MESSAGE = s
    else:
        MESSAGE = pickle.dumps(s)   
    #print(MESSAGE)
    print ("UDP target IP & port:", UDP_IP, port)
    print ("message:", MESSAGE)
    sock3 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
    sock3.sendto(MESSAGE, (UDP_IP, port))

class Receiver:
    ''' Buffer binary data from socket conn '''
    def __init__(self, conn):
        self.conn = conn
        self.buff = bytearray()

    def get(self, size):
        ''' Get size bytes from the buffer, reading
            from conn when necessary 
        '''
        while len(self.buff) < size:
            data = self.conn.recv(BUFSIZE)
            if not data:
                break
            self.buff.extend(data)
        # Extract the desired bytes
        result = self.buff[:size]
        # and remove them from the buffer
        del self.buff[:size]
        return bytes(result)

    def save(self, fname):
        ''' Save the remaining bytes to file fname '''
        with open(fname, 'wb') as f:
            if self.buff:
                f.write(bytes(self.buff))
            while True:
                data = self.conn.recv(BUFSIZE)
                if not data:
                    break
                f.write(data)

def send(sock2, data2):
    while data2:
        sent = sock2.send(data2)
        data2 = data2[sent:]

def send_file(ipToTransfer, transferList):
    while transferList:
        fname = transferList.pop(0)
        print("transferring:", fname)
        with open(fname, 'rb') as f:
            sock2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                sock2.connect((ipToTransfer, 5005))
            except socket.error as err:
                print(err, ipToTransfer, 5005)
                sock2.close()
                return

            # Send the file name length & the filename itself in one packet
            send(sock2, pack('B', len(fname)) + fname.encode())
            while True:
                data2 = f.read(BUFSIZE)
                if not data2:
                    break
                send(sock2, data2)

        sock2.close()

Когда host2 получает эту строку, он снова преобразует ее в список, но я получаюEOFError в этой части.Мой cmd не имеет возможности копирования, поэтому я загружаю фотографию с этой ошибкой:

enter image description here

Что не так?

1 Ответ

0 голосов
/ 01 февраля 2019

вы удаляете указатель на то, что выбирается

        transferStart = start[-num:]
        del start[-num:]
        l.release()
        msg = pickle.dumps(transferStart)

Если вы пытаетесь удалить элементы из списка, это не способ сделать это.Попробуйте добавить или переназначить другой список, в котором нет этого элемента и т. Д.

...