RFE27
Posts: 9
Joined: Tue May 28, 2019 8:49 am

Classes faciles d'utilisation pour client-serveur

Thu Jun 20, 2019 12:54 pm

Bonjour.
J'ai besoin de classes toutes faites et faciles d'utilisation en python pour un client (PC) et un serveur (RPi).
J'ai trouvé ceci qui correspond à ce que je cherche (voir Experiment 2):

http://www.python-exemplary.com/index_e ... on.inc.php

Le problème, c'est que c'est du python 2 et je suis en python3. J'ai fait une conversion avec 2to3. Je n'ai pas d'erreur de syntaxe. Le client se connecte au serveur, mais il y a une exception dès que le client envoie le message "go" au serveur (peut-être un problème de gestion des chaînes de caractères ??).
Est-ce qu'il existe les mêmes classes, mais en python3 ?
Merci pour les réponses.

danjperron
Posts: 3332
Joined: Thu Dec 27, 2012 4:05 am
Location: Québec, Canada

Re: Classes faciles d'utilisation pour client-serveur

Thu Jun 20, 2019 6:37 pm

Oui il y a print a modifier!

Les strings avec encode() et decode(). Les sockets n'envoient plus des caractères mais des bytearrays!


voici DataClient1.py modifié pour python3

Code: Select all

from threading import Thread
import socket, time

VERBOSE = True
IP_ADDRESS = "192.168.0.17"
IP_PORT = 22000

def debug(text):
    if VERBOSE:
        print ("Debug:---", text)

# ------------------------- class Receiver ---------------------------
class Receiver(Thread):
    def run(self):
        debug("Receiver thread started")
        while True:
            try:
                rxData = str(self.readServerData())
            except OSError as errmsg:
                print('socket receving error: ', errmsg)
#            except:
                debug("Exception in Receiver.run()")
                isReceiverRunning = False
                closeConnection()
                break
        debug("Receiver thread terminated")

    def readServerData(self):
        debug("Calling readResponse")
        bufSize = 4096
        data = ""
        while data[-1:] != "\0": # reply with end-of-message indicator
            try:
                blk = sock.recv(bufSize).decode('utf-8')
                if blk != None:
                    debug("Received data block from server, len: " + \
                        str(len(blk)))
                else:
                    debug("sock.recv() returned with None")
            except OSError as errmsg:
               print('qsocket receving error: ', errmsg)
               raise Exception("Exception from blocking sock.recv()")
            data += str(blk)
        print( "Data received:", str(data))
# ------------------------ End of Receiver ---------------------

def startReceiver():
    debug("Starting Receiver thread")
    receiver = Receiver()
    receiver.start()

def sendCommand(cmd):
    debug("sendCommand() with cmd = " + str(cmd))
    try:
        # append \0 as end-of-message indicator
        sock.sendall((cmd + "\0").encode('utf-8'))
    except:
        debug("Exception in sendCommand()")
        closeConnection()

def closeConnection():
    global isConnected
    debug("Closing socket")
    sock.close()
    isConnected = False

def connect():
    global sock
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    debug("Connecting...")
    try:
        sock.connect((IP_ADDRESS, IP_PORT))
    except:
        debug("Connection failed.")
        return False
    startReceiver()
    return True

sock = None
isConnected = False

if connect():
    isConnected = True
    print( "Connection established")
    time.sleep(1)
    while isConnected:
        print( "Sending command: go...")
        sendCommand("go")
        time.sleep(2)
else:
    print ("Connection to %s:%d failed" % (IP_ADDRESS, IP_PORT))
print( "done"  )

RFE27
Posts: 9
Joined: Tue May 28, 2019 8:49 am

Re: Classes faciles d'utilisation pour client-serveur

Fri Jun 21, 2019 7:46 am

Ça venait bien de la méthode sendall de la classe socket qui prend comme argument un tableau de bytes (python3) au lieu d'un string (python2).
J'ai réglé le problème avec les méthodes encode('utf8') et decode('utf8').
Merci pour les réponses.

Return to “Français”