it-swarm.com.de

String über Socket senden (Python)

Ich habe zwei Skripts, Server.py und Client.py. Ich habe zwei Ziele vor Augen: 

  1. Um immer wieder Daten vom Client an den Server senden zu können. 
  2. Um Daten vom Server an den Client senden zu können. 

hier ist mein 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())

und hier ist mein Kunde: 

#! /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 ()

Die Funktion funktioniert zum ersten Mal ('e' geht zum Server und ich bekomme eine Rückmeldung), aber wie kann ich es immer wieder passieren lassen (so etwas wie eine Chat-Anwendung)? .__ erstes Mal. Die Nachrichten gehen nicht nach dem ersten Mal weiter. Was mache ich falsch? Ich bin mit Python neu, also seien Sie bitte ein wenig ausführlich, und wenn Sie können, geben Sie bitte den Quellcode der gesamten Sache an. 

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)

Dies ist ein sehr einfaches Konzept, wie Sie das Problem lösen können ..__ Zuerst müssen Sie entweder den Client (serverseitig) akzeptieren, bevor Sie in Ihre while 1-Schleife gehen, da Sie in jeder Schleife einen neuen Client oder Sie akzeptieren So wie ich es beschreibe, wirfst du den Client in einen separaten Thread, den du von nun an alleine handhabst.

26
Torxed

Dieser Code ist falsch.

while 1:
    (clientsocket, address) = serversocket.accept()
    print ("connection found!")
    data = clientsocket.recv(1024).decode()
    print (data)
    r='REceieve'
    clientsocket.send(r.encode())

Der Aufruf von accept() auf den serversocket-Blöcken bis eine Clientverbindung besteht. Wenn Sie sich vom Client zum ersten Mal mit dem Server verbinden, akzeptiert er die Verbindung und empfängt Daten. Wenn es jedoch erneut in die Schleife eintritt, wartet es auf eine andere Verbindung und blockiert somit, da keine anderen Clients versuchen, eine Verbindung herzustellen.

Das ist der Grund, warum die recv nur beim ersten Mal korrekt funktioniert. Sie sollten herausfinden, wie Sie mit der Kommunikation mit einem akzeptierten Client umgehen können. Erstellen Sie dazu einen neuen Thread, um die Kommunikation mit diesem Client zu handhaben und weiterhin neue Clients in der Schleife anzunehmen.

Tipp: Wenn Sie an der Erstellung Ihrer eigenen Chat-Anwendung arbeiten möchten, sollten Sie sich eine Netzwerk-Engine wie Twisted ansehen. Es wird Ihnen auch helfen, das gesamte Konzept besser zu verstehen.

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()

Dies sollte der Code für einen kleinen Prototyp für die von Ihnen gewünschte Chat-App sein. __ Führen Sie beide in separaten Terminals aus, und überprüfen Sie dann die Ports.

1
Nischaya Sharma