J'ai deux scripts, Server.py et Client.py. J'ai deux objectifs en tête:
voici mon Server.py:
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host = "192.168.1.3"
port = 8000
print (Host)
print (port)
serversocket.bind((Host, port))
serversocket.listen(5)
print ('server started and listening')
while 1:
(clientsocket, address) = serversocket.accept()
print ("connection found!")
data = clientsocket.recv(1024).decode()
print (data)
r='REceieve'
clientsocket.send(r.encode())
et voici mon client:
#! /usr/bin/python3
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host ="192.168.1.3"
port =8000
s.connect((Host,port))
def ts(str):
s.send('e'.encode())
data = ''
data = s.recv(1024).decode()
print (data)
while 2:
r = input('enter')
ts(s)
s.close ()
La fonction est opérationnelle pour la première fois ("e" est envoyé au serveur et le message renvoyé est renvoyé), mais comment puis-je le répéter encore et encore (comme une application de chat)? première fois. Les messages ne vont pas après la première fois. Qu'est-ce que je fais mal? Je suis nouveau avec python, alors soyez un peu compliqué, et si vous le pouvez, donnez le code source de l’ensemble.
import socket
from threading import *
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Host = "192.168.1.3"
port = 8000
print (Host)
print (port)
serversocket.bind((Host, port))
class client(Thread):
def __init__(self, socket, address):
Thread.__init__(self)
self.sock = socket
self.addr = address
self.start()
def run(self):
while 1:
print('Client sent:', self.sock.recv(1024).decode())
self.sock.send(b'Oi you sent something to me')
serversocket.listen(5)
print ('server started and listening')
while 1:
clientsocket, address = serversocket.accept()
client(clientsocket, address)
C’est une conception très TRÈS simple pour savoir comment vous pouvez le résoudre… .. Tout d’abord, vous devez accepter le client (côté serveur) avant d’entrer dans votre boucle while 1
, faites ce que je décris, vous jetez le client dans un thread séparé que vous gérez lui-même à partir de maintenant.
Ce morceau de code est incorrect.
while 1:
(clientsocket, address) = serversocket.accept()
print ("connection found!")
data = clientsocket.recv(1024).decode()
print (data)
r='REceieve'
clientsocket.send(r.encode())
L'appel sur accept()
sur les blocs serversocket
jusqu'à ce qu'il y ait une connexion client. Lorsque vous vous connectez pour la première fois au serveur à partir du client, celui-ci accepte la connexion et reçoit les données. Cependant, lorsqu'il entre à nouveau dans la boucle, il attend une autre connexion et se bloque donc, car aucun autre client n'essaie de se connecter.
C’est la raison pour laquelle recv
ne fonctionne correctement que la première fois. Ce que vous devez faire est de savoir comment gérer la communication avec un client accepté - peut-être en créant un nouveau thread pour gérer la communication avec ce client et en continuant d'accepter de nouveaux clients en boucle, de la même manière.
Conseil: Si vous souhaitez créer votre propre application de discussion, vous devez utiliser un moteur de réseau tel que Twisted. Cela vous aidera également à mieux comprendre le concept dans son ensemble.
client.py
import socket
s = socket.socket()
s.connect(('127.0.0.1',12345))
while True:
str = raw_input("S: ")
s.send(str.encode());
if(str == "Bye" or str == "bye"):
break
print "N:",s.recv(1024).decode()
s.close()
server.py
import socket
s = socket.socket()
port = 12345
s.bind(('', port))
s.listen(5)
c, addr = s.accept()
print "Socket Up and running with a connection from",addr
while True:
rcvdData = c.recv(1024).decode()
print "S:",rcvdData
sendData = raw_input("N: ")
c.send(sendData.encode())
if(sendData == "Bye" or sendData == "bye"):
break
c.close()
Cela devrait être le code d’un petit prototype pour l’application de discussion que vous vouliez . Exécutez-les tous les deux dans des terminaux distincts, puis vérifiez les ports.