Сервер печатает только сообщения от последнего подключенного клиента - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь создать сервер, который принимает несколько клиентов. Клиенты могут отправлять сообщения на сервер, и сервер печатает эти сообщения. Мой код, приведенный ниже, дает странный результат, когда сообщения принимаются и распечатываются только на самом последнем соединении.

server.py

import socket
import _thread

HOST = "192.168.1.84"
PORT = 5000


def client_thread(conn):
    welcome_message = "Connected to server " + HOST + ":" + str(PORT) + "\n"
    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) + "\n")
        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.py

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 больше не отправляются на сервер. Теперь только Клиент 2 может отправлять сообщения на сервер и печатать их нормально.

Для дальнейшего выполнения клиент 3 подключается к серверу. Теперь сообщения как Клиента 1, так и Клиента 2 не отправляются на сервер, а только сообщения Клиента 3.

1 Ответ

0 голосов
/ 21 января 2019

Ваша функция client_thread имеет некоторые проблемы. conn - это соединение, передаваемое потоку, но connection и address читаются из глобального пространства имен. Вместо этого используйте переданное соединение и также передайте address, чтобы каждый поток ссылался только на локальные переменные для пары соединение / адрес, за которую он отвечает:

def client_thread(conn,addr):
    welcome_message = "Connected to server " + HOST + ":" + str(PORT) + "\n"
    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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...