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