2017-07-04 15 views
1

Ich arbeite mit 3 Raspberry Pi, eins als Server und die beiden anderen sind Clients. Ich möchte, dass die Clients gleichzeitig mit dem Server kommunizieren, ich möchte nicht auf die client1-Kommunikation warten, um die client2-Anfrage an den Server zu starten (was mir gelungen ist). Ich möchte jedoch, dass jeder Client gleichzeitig verschiedene Daten an den Server sendet. Ich habe versucht, Sockets und Threading zu verwenden, wie unten.python3: zwei Clients senden Daten an den Server mit Sockets

Servercode:

import socket 
import RPi.GPIO as GPIO 
from threading import Thread 


# Multithreaded Python server : TCP Server Socket Thread Pool 
class ClientThread(Thread): 

    def __init__(self,ip,port): 
     Thread.__init__(self) 
     self.ip = ip 
     self.port = port 
     print ("[+] New server socket thread started for " + ip + ":" + str(port)) 

    def run(self): 
     while True : 
      data = conn.recv(2048) 
      data = data.decode('utf-8') 
      print ("Server received data:", data) 
      MESSAGE = input("Multithreaded Python server : Enter Response from Server/Enter exit:") 
      if MESSAGE == 'exit': 
       break 
      conn.send(str.encode(MESSAGE)) # echo 

# Multithreaded Python server : TCP Server Socket Program Stub 
TCP_IP = '' 
TCP_PORT = 9050 
BUFFER_SIZE = 2000 # Usually 1024, but we need quick response 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

s.bind((TCP_IP, TCP_PORT)) 
s.listen(2) 
threads = [] 
list_data=[] 


while True: 

    print ("Multithreaded Python server : Waiting for connections from TCP clients...") 
    (conn, (ip,port)) = s.accept() 
    data = conn.recv(2048) 
    newthread = ClientThread(ip,port) 
    newthread.start() 
    threads.append(newthread) 
    list_data.append(data) 


for t in threads: 
    t.join() 

client1 Code:

import socket 
import RPi.GPIO as GPIO 
import time 


host = '192.168.0.198' 
port = 9050 
BUFFER_SIZE = 2000 
MESSAGE = input("tcpClient1: Enter message/ Enter exit:") 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 

while MESSAGE != 'exit': 
    s.send(str.encode(MESSAGE))  
    data = s.recv(BUFFER_SIZE) 
    data = data.decode('utf-8') 
    print (" Client2 received data:", data) 
    MESSAGE = input("tcpClient2: Enter message to continue/ Enter exit:") 

client2 Code:

import socket 
import RPi.GPIO as GPIO 
import time 

import socket 

host = '192.168.0.198' 
port = 9050 
BUFFER_SIZE = 2000 
MESSAGE = input("tcpClient2: Enter message/ Enter exit:") 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host, port)) 

while MESSAGE != 'exit': 
    s.send(str.encode(MESSAGE))  
    data = s.recv(BUFFER_SIZE) 
    data = data.decode('utf-8') 
    print (" Client received data:", data) 
    MESSAGE = input("tcpClient2: Enter message to continue/ Enter exit:") 

wenn i laufen, i erhalten: in dem Serverterminal:

Multithreaded Python server : Waiting for connections from TCP clients... 
[+] New server socket thread started for 192.168.0.197:47012 
Multithreaded Python server : Waiting for connections from TCP clients... 
[+] New server socket thread started for 192.168.0.196:47886 
Multithreaded Python server : Waiting for connections from TCP clients... 

in client1 Terminal:

tcpClient1: Enter message/ Enter exit:begin 

in client2 Terminal:

tcpClient2: Enter message/ Enter exit:begin 

Es scheint, wie Server nicht erhalten haben oder keine Daten senden.

+0

Wenn Sie sehen, 'Neue Server-Socket-Thread gestartet für 192.168.0.197: 47012' Sie bereits Daten empfangen' (conn, (ip, port)) = s.accept () data = conn.recv (2048) ' – Hikke

Antwort

0

Wie @Hikke in seinem Kommentar erwähnt, Ihr Server receives an zwei verschiedenen Orten. Der Aufruf conn.recv in diesem Code-Snippet verschlingt die Daten, die der Serverempfangs-Thread erwartet. Entfernen data = conn.recv(2048) in der Server-Hauptschleife:

while True: 

    print ("Multithreaded Python server : Waiting for connections from TCP clients...") 
    (conn, (ip,port)) = s.accept() 
    data = conn.recv(2048) # <== dont eat the data of your thread here! 
    newthread = ClientThread(ip,port) 
    newthread.start() 
    threads.append(newthread) 
    list_data.append(data) 
Verwandte Themen