Python socket. не работает recv
При повторном прохождении цикла WHILE, перестает слушать RECV() команды от клиента, но скрипт продолжает работать. Не понимаю что делать. Пишу этот серв для общения с другим устройством тоже через сокет. Если убрать "другое устройство" из кода, все та же ошибка, причем соединение с другим устройством отрабатывает как надо. Помогите пожалуйста, добрые люди!
import socket
import os
SOCKET_FILE = "./echo.socket"
if os.path.exists(SOCKET_FILE):
os.remove(SOCKET_FILE)
server_cu = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_cu.connect(('192.168.0.178', 5000))
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(('', 9193))
server.listen()
conn, addr = server.accept()
def ask_state():
cmd = [0x02, 0x0A, 0x00, 0x50, 0x03, 0x5F]
# server_cu.send(bytes(cmd))
def process_state(data=None):
print(data)
if data is None:
print("empty packet")
return False
if len(data) != 12:
print("Packet length mismatch")
if data[0] != 0x02 or data[2] != 0x00 or data[3] != 0x65 or data[10] != 0x03:
print("invalid packet")
return False
board_number = data[1]
lock_number = 1
states = []
for byte_num in range(4, 10):
for bit_num in range(0, 8):
state = 1 if data[byte_num] & (1 << bit_num) > 0 else 0
print(f"B:{board_number}, L{lock_number}, S{state}")
states.append([board_number, lock_number, state])
lock_number += 1
return str(states)
def unlock_all():
cmd = [0x02, 0x00, 0x30, 0x51, 0x03, 0x86]
server_cu.send(bytes(cmd))
while True:
conn, addr = server.accept()
datagram = conn.recvfrom(512)
if not datagram:
break
if datagram == b'check_status':
cmd = [0x02, 0x00, 0x00, 0x50, 0x03, 0x55]
ask_state()
states = None
data_recv = 0
while states is None:
data_recv = server_cu.recv(512)
if len(data_recv) == 12:
states = False
server.send(data_recv)
if datagram == b'unlock_all':
unlock_all()
if b'unlock_lock' in datagram:
cmd = [0x02, 0x00, 0x30, 0x51, 0x03, 0x86]
server_cu.send(bytes(cmd))
conn.sendall('Nice'.encode('utf-8'))
server.close()
os.remove(SOCKET_FILE)
В общем, с большой надеждой жду помощи
Ответы (1 шт):
Автор решения: eri
→ Ссылка
Потому что в цикле вы ожидаете новое соединение к серверу через
conn, addr = server.accept()
Уберите эту команду выше по коду, а в цикле вложите ещё один:
while True:
conn, addr = server.accept()
while True:
datagram = conn.recvfrom(512)
if not datagram:
break
.....