2 votes

Client-Serveur python : Le message reçu ne peut pas être imprimé individuellement

Je suis plutôt novice dans la programmation des réseaux. J'ai du matériel où je reçois normalement 2 messages groupés via un flux UDP (j'ai donc écrit un faux serveur pour simuler le matériel).

J'ai créé un simple client-serveur où le serveur envoie 2 messages et le client les récupère. Le problème est que lorsque j'imprime les données que je reçois du serveur, elles s'impriment sous la forme de deux messages, mais il n'y a aucun moyen de récupérer un seul des messages. J'ai essayé tout ce à quoi je peux penser. Je pense que la réponse est très simple.

Par exemple :

print(self.data) sorties :

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]) sorties :

#message1

#message2

ce que je veux que la sortie soit :

#message1

Alors comment puis-je seulement choisir #message1 ? Toute aide serait très appréciée. J'ai collé mon code ci-dessous :

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()

1voto

cerkiner Points 1626

Les impressions consécutives instantanées sont déroutantes mais votre code fonctionne bien.

Il vous suffit de séparer votre logique de traitement des données en déterminant le type de données que vous recevez. Quelle que soit la logique que vous mettez dans la boucle while, elle s'exécutera pour chaque message provenant de la socket.

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 ====")

Essayez ceci dans fakeClient.py, cela aura un sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X