Bonjour,
Je suis en train de tester socketserver. J'ai essayé de faire communiquer un windows 7 python 3 (client) :
Avec un "serveur" sous linux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 import socket import sys import time HOST, PORT = "192.168.23.1", 45600 data = " ".join(sys.argv[1:]) # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Connect to server and send data print(data+"\n") sock.connect((HOST, PORT)) try : sock.sendall(bytes(data + "\n", "utf-8")) sock.sendall(bytes(data[0:-1] + "\n", "utf-8")) sock.sendall(bytes(data[0:-2] + "\n", "utf-8")) finally: # Receive data from the server and shut down received = str(sock.recv(1024), "utf-8") sock.close() print("Sent: {}".format(data)) print("Received: {}".format(received))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #!/usr/bin/python2.7 # -*- coding: utf-8 -*- import socket import threading import SocketServer class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): data = self.request.recv(1024) cur_thread = threading.current_thread() #print("receive : "+data[0:-1]) self.server.tmp.insert(0,data[0:-1]) response = "{}: {}".format(cur_thread.name, data) self.request.sendall(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): tmp = [] def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) try: sock.sendall(message) response = sock.recv(1024) print "Received: {}".format(response) finally: sock.close()Quand je lance le client sous window celui-ci n'envoie que le premier sendall mais pas les deux commandes sendall suivantes environ 9 fois sur 10.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 !/usr/bin/python2.7 # -*- coding: utf-8 -*- import TCPSocket2 import time import signal def sortie(signum,frame): print "server stop running" server.shutdown() exit() # Port 0 means to select an arbitrary unused port HOST, PORT = "192.168.23.1", 45600 signal.signal(signal.SIGINT,sortie) server = TCPSocket2.ThreadedTCPServer((HOST, PORT), TCPSocket2.ThreadedTCPRequestHandler) ip, port = server.server_address print(server.timeout) server.timeout=500 print(server.timeout) # Start a thread with the server -- that thread will then start one # more thread for each request server_thread = TCPSocket2.threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates #server_thread.daemon = True print server_thread.daemon server_thread.start() print "Server loop running in thread:", server_thread.name while True: #q print len(server.tmp) while len(server.tmp)!=0: print server.tmp.pop() time.sleep(0.1) #server.shutdown()
Si j'essaie de remplacerpar
Code : Sélectionner tout - Visualiser dans une fenêtre à part sock.sendall(bytes(data + "\n", "utf-8"))J'ai une erreur 10053 (abandon de connexion par l'ordianteur hôte), idem si je fais des time.sleep(1) entre chaque commande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part print (sock.sendall(bytes(data + "\n", "utf-8")))
Si j'essaie le code du client sous linux j'obtiensdès le deuxième sendall.
Code : Sélectionner tout - Visualiser dans une fenêtre à part BrokenPipeError: [Errno 32] Broken pipe
J'ai essayé d'augmenter le timeout (jusqu'à 500) mais rien n'y fait. Il doit avoir un paramétre du serveur à positionner.
Merci d'avance pour votre aide.
Partager