Bonjour,

Je suis en train de tester socketserver. J'ai essayé de faire communiquer un windows 7 python 3 (client) :
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))
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
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()
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()
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.

Si j'essaie de remplacer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
sock.sendall(bytes(data + "\n", "utf-8"))
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
print (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.

Si j'essaie le code du client sous linux j'obtiens
Code : Sélectionner tout - Visualiser dans une fenêtre à part
BrokenPipeError: [Errno 32] Broken pipe
dès le deuxième sendall.

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.