Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么基于ID的TCP/IP服务器不工作?_Python_Sockets_Tcp_Server - Fatal编程技术网

Python 为什么基于ID的TCP/IP服务器不工作?

Python 为什么基于ID的TCP/IP服务器不工作?,python,sockets,tcp,server,Python,Sockets,Tcp,Server,我正在用python构建一个与客户端一起工作的tcp/ip服务器。 每个客户端都有自己的线程,它的套接字被添加到一个名为client_list的列表中。 还有一个变量“clients\u connected”,用于存储连接的客户端数量。 出于某种原因,目前它只适用于一个客户。 此外,当客户端断开连接时,应该将其从客户端列表中删除,但我不知道如何做到这一点。 请你看一下密码好吗?非常感谢 此线程正在查找传入连接: def addclientsthread(sock): gl

我正在用python构建一个与客户端一起工作的tcp/ip服务器。 每个客户端都有自己的线程,它的套接字被添加到一个名为client_list的列表中。 还有一个变量“clients\u connected”,用于存储连接的客户端数量。 出于某种原因,目前它只适用于一个客户。 此外,当客户端断开连接时,应该将其从客户端列表中删除,但我不知道如何做到这一点。 请你看一下密码好吗?非常感谢

此线程正在查找传入连接:

    def addclientsthread(sock):
        global client_list
        conn, addr = sock.accept()
        client_list += [conn]
        print_line('Client connected on ' + addr[0] + "\n")
        start_new_thread(clientthread, (conn,))
因此,当客户端连接时,它会得到自己的“clientthread”

哦,请不要讨厌,我刚开始编码:)

编辑:这是主代码(不在线程中)


我看不出这个代码有什么问题。问题可能出在
start\u new\u thread
函数中,或者可能只调用了一次
addclientsthread
。至于删除断开连接的客户端:
client\u列表。删除(连接)
感谢您的回复!addclientsthread实际上只在主程序中调用一次。让它一直听下去的最好方法是什么?我正在考虑在线程中使用
while True
循环,但我不确定这是否有效。哦,还有
客户端列表。删除(conn)
确实非常有效
addclientsthread
listen
调用后被调用,对吗?与其只调用一次,不如将它放入循环中,继续调用它<代码>接受阻塞,直到下一个客户端连接请求到来。
    def clientthread(conn):
        # handling connections.
        global clients_connected
        while True:
            # Receiving from client
            in_data = conn.recv(1024)
            data = decrypt(in_data)
            if data.lower().find("id=-1") != -1:
                clients_connected += 1
                print_line("new client ID set to " + str(clients_connected) + "\n")
                crypted_msg = encrypt("SID=" + str(clients_connected))
                conn.sendall(crypted_msg)
                pass
            elif data.lower().find("uin") == 0:
                uin_id = int(data[4:])
                clients_connected -= 1
                break
            else:
                print_line(data)
            if not data:
                break

        # If client disconnects
        conn.close()
    HOST = ''
    PORT = 8820
    clients_connected = 0
    client_list = []
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print('Socket created')

    # Bind socket to host and port
    try:
        s.bind((HOST, PORT))
    except socket.error, msg:
        print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
        sys.exit()

    print 'Socket successfully binded'

    # Start listening on socket
    s.listen(100000)
    print 'Socket is listening'

    start_new_thread(addclientsthread, (s,))