服务器仅打印来自最近连接的客户端的消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务器仅打印来自最近连接的客户端的消息相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个接受多个客户端的服务器。客户端可以向服务器发送消息,服务器打印这些消息。我的下面的代码产生了一个奇怪的结果,其中只有最近的连接的消息被服务器接受和打印。

server.朋友

import socket
import _thread

HOST = "192.168.1.84"
PORT = 5000


def client_thread(conn):
    welcome_message = "Connected to server " + HOST + ":" + str(PORT) + "
"
    conn.send(welcome_message.encode("ascii"))
    while True:
        data = connection.recv(2048)
        message = data.decode("ascii")
        if not data:
            break
        print("(" + address[0] + ":" + str(address[1]) + ") " + message)
    connection.close()


with socket.socket() as server_socket:
    try:
        server_socket.bind((HOST, PORT))
        server_socket.listen(10)
        print("Server hosted on " + HOST + ":" + str(PORT) + "
")
        while True:
            connection, address = server_socket.accept()
            _thread.start_new_thread(client_thread, (connection,))
            print("Connection from " + address[0] + ":" + str(address[1]))

    except socket.error as error_message:
        print("Error: " + str(error_message))

client.朋友

import socket

HOST = "192.168.1.84"
PORT = 5000

with socket.socket() as client_socket:
    try:
        client_socket.connect((HOST, PORT))
        data = client_socket.recv(2048)
        print(data.decode("ascii"))
        while True:
            message = input()
            data = message.encode("ascii")
            client_socket.send(data)
    except socket.error as error_message:
        print("Error: " + str(error_message))

问题输出行为:

客户端1可以连接到服务器并发送消息。服务器接收并打印这些消息。

现在,当客户端2连接到服务器时,客户端1的消息不再发送到服务器。现在只有Client 2可以向服务器发送消息并将其打印得很好。

为了进一步实现这一点,客户端3连接到服务器。现在客户端1和客户端2的消息都不会发送到服务器,只有客户端3的消息是。

答案

你的client_thread功能有一些问题。 conn是传递给线程的连接,但是connectionaddress正在从全局命名空间中读取。相反,使用传入的连接并传递address,因此每个线程仅引用它负责的连接/地址对的局部变量:

def client_thread(conn,addr):
    welcome_message = "Connected to server " + HOST + ":" + str(PORT) + "
"
    conn.send(welcome_message.encode("ascii"))
    while True:
        data = conn.recv(2048)
        message = data.decode("ascii")
        if not data:
            break
        print("(" + addr[0] + ":" + str(addr[1]) + ") " + message)
    conn.close()

在主要代码中:

_thread.start_new_thread(client_thread, (connection,address))

以上是关于服务器仅打印来自最近连接的客户端的消息的主要内容,如果未能解决你的问题,请参考以下文章

go语言实现简单的聊天室

基于UDP的客户端和服务器端的代码设计

只有一个客户端在多个客户端的服务器中接收消息

无法解码来自客户端的握手请求

为啥在打印消息时名称会打印两次?

网络是怎样连接的-第一章-全世界 DNS 服务器的大接力