2017-07-04 70 views
1

我正在使用3个树莓派,一个作为服务器,另外两个客户端。我想要做的是让客户端同时与服务器进行通信,我不想等待客户端1通信完成,以便启动客户端2对服务器的请求(我成功做到了)。但是,我希望每个客户端同时向服务器发送不同的数据。我尝试使用套接字和线程,如下所示。python3:两个客户端使用套接字发送数据到服务器

服务器代码:

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

客户端1码:

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:") 

客户端2的代码:

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:") 

当我运行,我得到: 在服务器终端:

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

在CLIENT1终端:

tcpClient1: Enter message/ Enter exit:begin 

在客户机程序终端:

tcpClient2: Enter message/ Enter exit:begin 

好像服务器未收到或发送任何数据。

+0

当你看到'新服务器套接字线程开始为192.168.0.197:47012'您已经接收到的数据'(康涅狄格州,(IP,端口))= s.accept( ) data = conn.recv(2048)' – Hikke

回答

0

正如@Hikke在他的评论中提到的,你的服务器receives位于两个不同的地方。此代码片段中的conn.recv调用会占用服务器接收线程所期望的数据。在您的服务器的主循环删除data = conn.recv(2048)

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) 
相关问题