envoi de lignes de commande via un socket
Bonjour,
Je cherche à faire fonctionner deux scripts ensemble afin de tester une application.
Un premier script gèrerait le séquencement du test en envoyant successivement les commandes.
Un second script recevrait les commandes, et après les avoir interpètées, piloterait l'application à tester.
Le problème que je rencontre, est que l'envoi d'une commande à l'aide de la méthode socket.send fonctionne.
Si j'envoie deux commandes successives (espacées de 10 secondes dans le temps), mon serveur reçoit une chaine de caractère qui semble concaténer mes deux commandes. Je reçois ainsi "Force Var_Left TRUEForce..."
Comment puis-je forcer l'envoi des commandes de manières séparées et successives ?
Merci pour votre aide.
Le script serveur attend chaque commande:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
socket.bind(('', 15555))
except socket.error:
print("Echec connexion")
sys.exit()
while (Running==True):
#while True:
socket.listen(5)
client, address = socket.accept()
print("{} connected".format( address ))
response = client.recv(255)
if response != "":
CommandLine=(response.split(" "))
if CommandLine[0]=="Quit":
QuitApplication()
Running=False
if CommandLine[0]=="Force":
ForceValue(CommandLine[1], CommandLine[2])
CommandLine[:]=[]
response=""
print("Close")
client.close()
socket.close() |
Le script client envoi les commandes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((hote, port))
print "Connection on {}".format(port)
socket.send(u"Force Var_Left TRUE")
time.sleep(10)
socket.send(u"Force Var_Right TRUE")
time.sleep(10)
socket.send(u"Quit")
print("Close")
socket.close() |
Envoi de socket.send() successifs
Bonjour,
J'ai modifié mon code pour pouvoir gérer des messages. Quelque chose de simple pour le moment, un caractère " " entre chaque élement ce qui me permet de récupérer facilement une liste d'éléments à traiter.
Par contre, je voulais faire en sorte que le serveur écoute en permanence et réalise les actions au fur et à mesure de la réception des commandes.
Et là, je constate que dans cette partie de code, seule est reçu par le serveur le premier "send"
Code:
1 2 3 4 5
| socket.send(u"Force Var_Left TRUE")
time.sleep(10)
socket.send(u"Force Var_Right TRUE")
time.sleep(10)
socket.send(u"Quit") |
Je constate aussi que le serveur est bien toujours à l'écoute et fonctionnel puisque le déroulement d'un autre script arrête bien le serveur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| import socket
hote = "localhost"
port = 15555
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((hote, port))
print "Connection on {}".format(port)
socket.send(u"Quit ")
print "Close"
socket.close() |
J'ai donc essayé d'utiliser des commandes close et connect entre chaque utilisation de "socket.send" :
Code:
1 2
| socket.close()
socket.connect((hote, port)) |
Mais le script rencontre alors des problèmes d'utilisation multiple d'un même port.
Comment puis-je faire pour que les utilisations successives de "socket.send" soient prises en compte ? Est ce qu'il y a une commande pour libérer le port avant réutilisation ? Est-il judicieux de clore la connexion entre chaque envoi ?
J'ai regardé le how-to, mais j'avoue que ce n'est pas trop simple à comprendre quand on débute sur ces questions d'échanges via le réseau.
Merci,
Est-il possible d'utiliser plusieurs commande socket.send() avec une même connexion ?
Bonjour,
J'ai repris mes programmes précédents (client et serveur) avec ce que j'ai compris du "How-to" sur la programmation des sockets.
Avec ce code, le serveur se lance bien et reste actif en attente de commande.
Le programme client, malheureusement, n'arrive à envoyer qu'une fois. La seconde utilisation de socket.send() dans le même programme client s'exécute sans erreur apparente, mais le message envoyé n'est pas reçu par le serveur.
Par contre, si je relance le script client une fois que la première exécution est terminée, le premier message envoyé est une nouvelle fois bien reçu (et le second, une fois encore n'est pas reçu). Ce qui prouve que mon serveur est bien toujours à l'écoute.
Quand je regarde les retour de la commande d'envoi, j'ai bien les retours avec les longueurs des messages dont je demande l'envoi.
Pourtant, si je ferme la connexion par socket.close() puis rouvre une connexion par socket.connect(("localhost", 15555)) entre chaque envoi, je rencontre une erreur disant que le programme essaie d'établir une connexion déjà en cours.
Est ce que cela veut dire qu'un seul envoi peut être effectué à chaque connexion ? Ou j'ai raté un truc ?
Je n'arrive pas à voir ce qui empêcherait ce second envoi dans le même programme de manière systématique. Ni encore moins comment solutionner ce problème ... Des idées de solutions ou de méthodes d'investigation ? A part capturer les échanges de trames TCP/IP, je ne vois plus quoi tenter ?
Merci,
Voici les deux programmes :
serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import socket
CommandLine = list()
Running=True
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.bind(('', 15555))
socket.listen(5)
debug = open("debug_t.txt","w")
while (Running==True):
#while True:
#socket.listen(5)
client, address = socket.accept()
debug.write("{} connected\n".format( address ))
#ct = client_thread(client)
#ct.run()
response = client.recv(255)
if response != "":
debug.write("response\n")
debug.write(response)
CommandLine=(response.split(" "))
debug.write("\nCommandLine\n")
print("\n",CommandLine,"\n")
for elem in CommandLine:
debug.write("\nelem\n")
debug.write(elem)
if elem=="Quit":
debug.write("\ncommand Quit\n")
Running=False
if elem=="Force":
indice=CommandLine.index(elem)
debug.write("\ncommand Force\n")
print(CommandLine[indice:indice+3])
debug.write("\n---------------\n")
debug.close()
print("Close")
client.close()
socket.close() |
client :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import time
import socket
hote = "localhost"
port = 15555
class mysocket:
def __init__(self, sock=None):
if sock is None:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
else:
self.sock = sock
def connect(self, host, port):
self.sock.connect((host, port))
self.sock.setblocking(0)
def close(self):
self.sock.close()
def mysend(self, msg):
totalsent = 0
sent = self.sock.send(msg)
print(sent)
if sent == 0:
raise RuntimeError("socket connection broken")
if __name__== '__main__':
socket=mysocket()
socket.connect(hote, port)
print("\n--------------------------\n")
print(i)
cmd ="Force Var_Right TRUE "
socket.mysend(cmd)
print("\nsending 1 done\n")
time.sleep(10)
cmd ="Force Var_Left FALSE "
socket.mysend(cmd)
time.sleep(10)
print("\nQuit\n")
print("\n--------------------------\n")
cmd ="Quit "
socket.mysend(cmd)
socket.close() |