Петля сокета Python не разрывается - PullRequest
0 голосов
/ 03 декабря 2018

Я создал разъем для двух ПК, один - Raspberry Pi, а другой - мой ноутбук.Я только что соединил два, затем отправляю строку для проверки соединенияЕсли я посылаю символ «q» из RPi, мой компьютер должен выйти из цикла и закрыть соединение, но это не так.Часть print("Listening") все еще работает.Зачем?Смотрите код ниже.

import socket
import time

# IP address of this PC.
TCP_IP = '192.168.137.1'

# Port.
TCP_PORT = 5005

# Size of buffer.
BUFFER_SIZE = 1024

# Create a socket, connect and listen to it.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print('Connection address:', addr)

while 1:
    print("Listening")
    data = conn.recv(BUFFER_SIZE)
    data = data.decode()

    if data=='q':
        break

    if  data: 
        print ("Received data:", data)
        # Echo back. 
        conn.send(data.encode())

    time.sleep(1)

print("It breaks.") 
conn.close()
s.close()

1 Ответ

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

TCP - это потоковый протокол.Таким образом, передаваемые данные являются потоком, а не последовательностью сообщений.Поэтому, когда вы ожидаете, что data будет q, на самом деле это some_data_sent_before_q_and_finally_q.

Самый простой способ исправить код - использовать if data.endswith('q') вместо if data=='q'.Может работать, а может и не зависеть от того, как вы на самом деле используете соединение.Например, этот подход может дать сбой с some_data_sent_before_q довольно длинной паузой more_data_and_q и с some_data_sent_before_q_and_finally_q_plus_something_else_why_not.

Немного более продвинутым способом решения проблемы является разделение потока на сообщения с разделителями - message_1<separator>message_2<separator>q<separator>.Этот метод позволит вам обрабатывать каждое сообщение отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...