python中的tcp服务器不处理多个客户端

python中的tcp服务器不处理多个客户端,python,linux,sockets,tcp,Python,Linux,Sockets,Tcp,我需要一个TCP服务器在Raspberry Pi上运行,它将允许多个同时的客户端连接,处理请求,允许客户端优雅地断开连接,并永远继续侦听。我在这里的一篇老文章中发现了一些代码,这些代码很接近,但有一些问题我找不到解决方案。服务器脚本是: import socket,threading TIP = '192.168.99.161' TPORT = 3006 BUFFER_SIZE = 20 class ClientThread(threading.Thread): def __i

我需要一个TCP服务器在Raspberry Pi上运行,它将允许多个同时的客户端连接,处理请求,允许客户端优雅地断开连接,并永远继续侦听。我在这里的一篇老文章中发现了一些代码,这些代码很接近,但有一些问题我找不到解决方案。服务器脚本是:

import socket,threading

TIP   = '192.168.99.161'
TPORT = 3006
BUFFER_SIZE = 20

class ClientThread(threading.Thread):

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


    def run(self):    
        print "Connection from : "+ip+":"+str(port)
        clientsock.send("\nRPI02\n")
        data = "111"
        eof=False
        while len(data):
            data = clientsock.recv(20)
            for c in data:
                print ("%02X"%(ord(c)))
                if(c == 'z'):
                eof=True
            if(eof):
                # simulated packet:            
                clientsock.send("packet was processed.")
                eof = False

        print "%s:%d disconnected"%(ip,port)

host = "0.0.0.0"
port = 9999

tcpsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

tcpsock.bind((TIP,TPORT))
threads = []

while True:
    tcpsock.listen(4)
    print "\nListening for incoming connections..."
    (clientsock, (ip, port)) = tcpsock.accept()
    newthread = ClientThread(ip, port,clientsock)
    newthread.start()
    threads.append(newthread)

for t in threads:
    t.join()

tcpsock.shutdown(sock.SHUT_RDWR)
tcpsock.close()
如果我运行一个客户机,我可以毫无问题地处理数据(发送许多字节)

这个系统的期望是,我不希望连接两个以上的客户端。当客户端连接时,它将发送3-4字节的请求数据,一旦收到应答,它将断开连接(客户端上的另一个Pi)

我用两个客户端窗口运行了一个测试,一个发送“123”,另一个发送“abc”。从客户端发送一个“z”会得到一条确认已处理数据包的服务器消息

以下是测试运行:

mpi@RPI01 ~/iorelay $ python erc-test.py

Listening for incoming connections...
[+] New thread started for 192.168.99.99:64351

Listening for incoming connections...
Connection from : 192.168.99.99:64351
31
32
33
7A
[+] New thread started for 192.168.99.99:64361

Listening for incoming connections...
Connection from : 192.168.99.99:64361
61
62
63
7A
31
61
62
63
61
62
63
192.168.99.99:64361 disconnected
192.168.99.99:64361 disconnected
我在这里看到几个问题:

  • 第二个(或最后一个)连接的客户机可以全天发送数据,并使用来自服务器的假数据包响应。所有以前的客户机可能会再发送几个字节(本例中为一个字节),但最终服务器会停止接收这些字节

  • 我断开了第一个客户端的连接,没有出现断开连接消息。当我关闭第二个时,我打印了两条具有相同客户端端口号的断开连接消息

  • 我不理解main while()之后的“t.join”循环-这是为了什么?如果我把这个评论出来,它似乎没有改变什么

  • 即使在最后使用shutdown()调用,当我使用ctl-z关闭此脚本时,套接字显然挂起。当我再次运行脚本时,它会抱怨套接字正在使用

  • 如何清理Linux中所有挂起的套接字?(拉斯比安在Pi上)


  • 感谢您在这方面的帮助-仍在学习Python

    有几件有趣的事情-1)为什么你说数据没有从第一个客户端接收到?还不清楚-你也可以发布你的客户程序吗?我相信,如果我试着自己运行其中一些,看看到底是什么问题,可以解释您的一些问题。我不再看到接收到的每个字节的print语句,因此我假设clientsock.recv()没有返回任何内容(不确定)。没有客户端程序-我打开多个命令窗口并在python服务器中运行telnet。连接第二个telnet会话后,您应该能够在第一个telnet会话中看到无接收问题…可能您应该粘贴客户端代码。你的最后一条“断开的线路令人惊讶”,所以我想亲自运行它,看看真正的问题是什么。