Получение данных из сокета через ip
я пишу скрипт, который получает данные от другой программы через ip с помощью следующей функции. В первых двух байтах закодировано, какая должна быть длина сообщения, поэтому сначала считываются первые два байта, а затем, если длина пришедшего сообщения больше получившегося числа - сообщение считается пришедшим. Проблема связанна с тем, что программа выкидывает сообщения каждую секунду, а скрипт считывает только первое.
def ip_connect(self):
bind_ip = '127.0.0.1'
bind_port = 12345
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(5) # max backlog of connections
print('Listening on {}:{}'.format(bind_ip, bind_port))
def handle_client_connection(client_socket):
request = client_socket.recv(1024)
len_message = int.from_bytes(request[:2], 'big')
if len(request) > len_message:
message = request[2:]
print(codecs.decode(message, 'UTF-8'))
while True:
print('123')
client_sock, address = server.accept()
print ('Accepted connection from {}:{}'.format(address[0], address[1]))
client_handler = threading.Thread(
target = handle_client_connection,
args = (client_sock,) # without comma you'd get a... TypeError: handle_client_connection() argument after * must be a sequence, not _socketobject
)
client_handler.start()
Ответы (1 шт):
Автор решения: follow_the_sun
→ Ссылка
Я переписал свою функцию получения данных следующим образом, все работает корректно:
def ip_connect():
HOST = '127.0.0.1' # Standard loopback interface address (localhost)
PORT = 12345 # Port to listen on (non-privileged ports are > 1023)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
request = conn.recv(1024)
msg_size = 0
if msg_size == 0:
if len(request) < 2:
pass
else:
len_message = int.from_bytes(request[:2], 'big')
if len(request) < len_message:
pass
else:
message = request[2:]
message = codecs.decode(message, 'UTF-8')
message = message[1 : -1]
msg_to_list = message.split(',')
data = []
for msg in msg_to_list:
msg = msg.split(':')
msg = msg[1][1:-1]
data.append(msg)
msg_size == 0
if not data:
break