Клиент-сервер python: полученное сообщение не может быть распечатано отдельно - PullRequest
0 голосов
/ 24 марта 2020

Я довольно новичок во всем сетевом программировании. У меня есть какое-то оборудование, где я обычно получаю 2 связанных сообщения через поток UDP (поэтому я написал поддельный сервер для имитации оборудования)

Я создал простой клиент-сервер, где сервер отправляет 2 сообщения, а клиент выбирает их вверх. Моя проблема заключается в том, что, когда я распечатываю данные, полученные от сервера, они распечатываются как 2 сообщения, но невозможно получить только одно из них. Я перепробовал все, что мог придумать. Я чувствую, что ответ очень прост.

Например:

print(self.data) выходы:

b'#message1,765,0,77.5,allgood,2096,183412.000' b'#message2,654,0,76.5,allgood,2096,183411.000'

print(self.data.decode().split(',')[0]) выходы:

#message1

#message2

что я хочу, чтобы вывод был:

#message1

Так как я могу выбрать только #message1? Любая помощь приветствуется. Я вставляю свой код ниже:

fakeServer.py:

import socket
import time
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE1 = "#message1,765,0,77.5,allgood,2096,183412.000"
MESSAGE2 = "#message2,654,0,76.5,allgood,2096,183411.000"

print ("UDP target IP:", UDP_IP)
print ("UDP target port:", UDP_PORT)
print ("message1:", MESSAGE1)
print ("message2:", MESSAGE2)

while True:
    sock = socket.socket(socket.AF_INET, # Internet
                    socket.SOCK_DGRAM) # UDP
    sock.sendto(MESSAGE1.encode('utf-8'), (UDP_IP, UDP_PORT))
    sock.sendto(MESSAGE2.encode('utf-8'), (UDP_IP, UDP_PORT))
    time.sleep(3)

fakeClient.py

import socket
from tspiMessages import *
import io


class Client():
    def __init__(self):
        self.client()
    def client(self):
        server_address = ('', 5005)

        sock = socket.socket(socket.AF_INET, # Internet
                        socket.SOCK_DGRAM) # UDP
        sock.bind(server_address)
        try:
            while True:
                self.data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
                self.data1 = self.data.decode().split(',')#[0]
                print(self.data)

        finally:
            sock.close()


if __name__ == '__main__':
    client = Client()

1 Ответ

0 голосов
/ 24 марта 2020

Мгновенные последовательные распечатки выглядят сбивающими с толку, но ваш код работает нормально.

Вам просто нужно отделить свои логи обработки данных c, определив тип данных, которые вы получаете. Какие бы логики c вы ни указали, пока l oop будет запускаться для каждого сообщения из сокета.

self.data, addr = sock.recvfrom(1024)
print("==== NEW DATA RECEIVED ====")
if "message1" in self.data:
  print("DATA TYPE IS message1")
  print("======== START message1 DATA ====")
  print(self.data)
  print("======== END message1 DATA ====")
elif "message2" in self.data:
  print("DATA TYPE IS message2")
  print("======== START message2 DATA ====")
  print(self.data)
  print("======== END message2 DATA ====")
else:
  print("DATA TYPE IS UNKNOWN")
  print("======== START UNKNOWN DATA ====")
  print(self.data)
  print("======== END UNKNOWN DATA ====")
print("==== DATA PROCESSING ENDS ====")

Попробуйте это в fakeClient.py, это будет иметь смысл.

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