web-dev-qa-db-fra.com

Envoi de chaîne via socket (python)

J'ai deux scripts, Server.py et Client.py. J'ai deux objectifs en tête: 

  1. Pour pouvoir envoyer des données à plusieurs reprises au serveur à partir du client. 
  2. Pour pouvoir envoyer des données du serveur au client. 

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. 

20
harveyslash
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.

26
Torxed

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.

5
gravetii

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.

1
Nischaya Sharma