(Python) Socket聊天返回用户名作为IP和端口



我正在为学校做一个TCP套接字聊天任务。我在完成最后一部分时遇到了麻烦,这是在客户端请求时返回所有用户名。客户端可以写/users来获取所有连接的用户名,但获取的是他们连接的IP和PORT,输出示例:(127.0.0.1, 54612)

服务器代码:

import socket, threading
clients = []
nicknames = []
BYTES = 1024
FORMAT = "utf-8"

def server():
IP = "127.0.0.1"
PORT = 9090
BIND = (IP, PORT)
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(BIND)
sock.listen()
print("Welcome to Budget-Discord!")
while True:
client, addr = sock.accept()
print("Connected with {}".format(str(addr)))       
client.send('NICKNAME'.encode(FORMAT))
nickname = client.recv(BYTES).decode()
nicknames.append(nickname)
clients.append(client)
print("Nickname is {}".format(nickname))
print(nicknames)
#broadcast("{} joined!".format(nickname).encode(FORMAT))
client.send("t >>> Connected to server!".encode(FORMAT))
threading.Thread(target=user_conn, args=[client, addr]).start()
except Exception as e:
print(f"Error, socket: {e}")

def sendall(msg: str, conn: socket.socket): # Broadcast
for client_conn in clients:
if client_conn != conn:
try:
client_conn.send(msg.encode())
except Exception as e:
print(f"Error, sendall: {e}")
byeee(client_conn)

def user_conn(conn: socket.socket, nicknames):
while True:
try:
msg = conn.recv(BYTES).decode()
if "/users" in msg:
conn.sendall(bytearray(str(nicknames).encode()))
if msg:
print(msg)
allchat = f"{msg}"
sendall(allchat, conn)
# else:
#     pass
except Exception as e:
print(f"Error, user connection: {e}")
byeee(conn)
break

def byeee(conn: socket.socket):
if conn in clients:
conn.close()
clients.remove(conn)

if __name__ == "__main__":
server()

客户机代码:

import socket, threading
IP = "127.0.0.1"
PORT = 9090
BIND = (IP, PORT)
BYTES = 1024
FORMAT = "utf-8"
nickname = input("Choose your nickname: ")
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
client.connect(BIND)                            
def receive():
while True:                                                
try:
msg = client.recv(BYTES).decode()
if msg == 'NICKNAME':
client.send(nickname.encode())
# elif message == "/users"
else:
print(msg)
except Exception as e:
print(f"Error, client receive: {e}")
client.close()
break
def write():
while True:                                                
msg = f"{nickname}: {input('')}"
client.send(msg.encode())
receive_t = threading.Thread(target=receive).start()            
write_t = threading.Thread(target=write).start()                   

我尝试过不同的事情,得到元组错误的大部分,所以我转换/用户在服务器模块到bytearray…

在函数server中,这一行发送addr作为第二个参数:

threading.Thread(target=user_conn, args=[client, addr]).start()

但是函数user_conn有第二个参数nicknames:

def user_conn(conn: socket.socket, nicknames):

所以发送nicknames代替server:

threading.Thread(target=user_conn, args=[client, nicknames]).start()

最新更新