Problème de connexion avec socketserver
Bonjour,
Je suis en train de tester socketserver. J'ai essayé de faire communiquer un windows 7 python 3 (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
| 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:
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:
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:
sock.sendall(bytes(data + "\n", "utf-8"))
par
Code:
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:
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.