Пустая строка добавляется в deque - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть на хосте deque.Каждая строка, полученная через TCP-сокет, добавляется в эту очередь.Когда все данные получены, я печатаю данные и бланк.Вот код:

from __future__ import print_function
import commands
import socket
import select
from collections import deque

host = commands.getoutput("hostname -I")
port = 5005
backlog = 5
BUFSIZE = 4096
BUFFER_SIZE = 1024
q = deque()

def read_tcp(s):
    conn, addr = s.accept()
    print('Connected with', *addr)
    while 1:
        data = conn.recv(BUFFER_SIZE)
        if not data: break
        print("received data:", data)
        conn.send(data)  # echo
    if (data == 'sample.jpg'):
        print("start processing")
        #processP(q)
    else:
        print("appended")
        q.append(data)
        print(q)
    conn.close()

def read_udp(s):
    data,addr = s.recvfrom(1024)
    print("received message:", data)

def run():
    # create tcp socket
    tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    try:
        tcp.bind((host,port))
    except socket.error as err:
        print('Bind failed', err)
        return
    tcp.listen(1)
    # create udp socket
    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
    udp.bind((host,port))
    print('***Socket now listening at***:', host, port)
    input = [tcp,udp]
    try:
        while True:
            #print("select.select")
            inputready,outputready,exceptready = select.select(input,[],[], 0.1)
            for s in inputready:
                if s == tcp:
                    read_tcp(s)
                elif s == udp:
                    read_udp(s)
                else:
                    print("unknown socket:", s)
    # Hit Break / Ctrl-C to exit
    except KeyboardInterrupt:
        print('\nClosing')
        raise
    tcp.close()
    udp.close()

if __name__ == '__main__':
    run()

Проблема в том, что когда я печатаю полученные данные и деку в этих строках print("received data:", data) и print(q), полученные данные печатаются правильно, но содержимое дека печатаетсякак на каждом шаге:

deque([''])
deque(['',''])
deque(['','',''])

Что не так?Вот код отправителя, который, похоже, не имеет проблем:

from __future__ import print_function
import socket
from struct import pack
import commands
import select

#HOST = '10.0.0.2'
PORT = 5005
BUFSIZE = 4096

def tcp_send(s, ip):
    TCP_IP = ip
    BUFFER_SIZE = 1024
    MESSAGE = s
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((TCP_IP, PORT))
    s.send(MESSAGE)
    data = s.recv(BUFFER_SIZE)
    s.close()
    print ("sent data:", data)

fnames = [
    '90.jpg','91.jpg','92.jpg','93.jpg','94.jpg','95.jpg','96.jpg','97.jpg','98.jpg','99.jpg','100.jpg','sample.jpg'
    ]

def main():
    for fname1 in fnames:
        tcp_send(fname1,'10.0.0.2')

if __name__ == '__main__':
    main()

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

замените ваши read_tcp (s) на

def read_tcp(s):
conn, addr = s.accept()
print('Connected with', *addr)
while 1:
    data = conn.recv(BUFFER_SIZE)
    if not data: break
    print("received data:", data)
    conn.send(data)  # echo
    print(data)
    if (data == 'sample.jpg'):
        print("start processing")
        #processP(q)
    else:
        print("appended", data)
        q.append(data)
        print(q)
conn.close()

, вы пытаетесь получить доступ к данным извне, поэтому они пусты

0 голосов
/ 14 декабря 2018

Похоже на проблему с отступами.Вы выйдете из цикла while (в read_tcp()) только тогда, когда data оценивается False.Только тогда, уже вне цикла, вы добавляете текущее значение data к деке q.В цикле вы печатаете каждый кусок данных, которые вы получаете.Я думаю, что блок if должен иметь отступ на один уровень, чтобы быть частью цикла.

Также в read_udp() Я не вижу, чтобы вы добавляли что-либо в deque

...