Python-сокет продолжает поступать даже после завершения работы клиента - PullRequest
0 голосов
/ 01 июня 2018

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

from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread

clients = []

HOST = gethostname()
PORT = 33000
BUFFER_SIZE = 1024
ADDR = (HOST, PORT)

s = socket(AF_INET, SOCK_STREAM)
s.bind(ADDR)

def accept_client():
    while True:
        client, _ = s.accept()
        clients.append(client)
        print("Client accepted.")
        thread.start_new_thread(handle_client, (client, ))

def handle_client(client):
    while True:
        message = client.recv(BUFFER_SIZE)
        print("Incoming message: {}".format(message.decode('utf-8')))
        broadcast(message)

def broadcast(message):
    print("Broadcasting...")
    for c in clients:
        print("Broadcasting to {}".format(c))
        c.send(message)

if __name__ == '__main__':
    s.listen()
    print("Listening...")
    thread.start_new_thread(accept_client, ())
    try:
        while True:
            pass
    except KeyboardInterrupt:
        print("Exited.")
        exit(0)

А вот класс для моего клиента.

from socket import AF_INET, gethostname, socket, SOCK_STREAM
import _thread as thread

class SocketClient:
    buffer_size = 1024

    def __init__(self, host=gethostname(), port=33000):
        self.host = host
        self.port = port
        self.buffer_size = 1024
        self.s = socket(AF_INET, SOCK_STREAM)
        self.s.connect((self.host, self.port))

    def bind_callback(self, callback, args=()):
        thread.start_new_thread(self.receive, (callback, args))

    def receive(self, callback, args):
        while True:
            try:
                msg = self.s.recv(self.buffer_size).decode('utf-8')
                callback(msg, *args)
            except OSError as err:
                self.close()
                raise err
            except NameError:
                raise err

    def send(self, msg):
        try:
            self.s.send(msg.encode('utf-8'))
        except:
            self.close()

    def close(self):
        self.send('{clientClose}')
        self.s.close()

В другом скрипте, в котором я создал объект SocketClient, , существует бесконечное количество входящих сокетов после завершения скрипта (по Ctrl + D в Python),Сценарий сервера (который печатает попытку при получении входящего сокета) неоднократно показывает это:

Incoming message: 
Broadcasting...
Broadcasting to <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44126)>
Broadcasting to <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.1.1', 33000), raddr=('127.0.0.1', 44276)>

Заметьте, что, кажется, нет входящих сообщений.

Я предполагаю, что я 'Не удалось правильно закрыть сокетное соединение (до выхода).Как этого достичь?Заранее спасибо.

1 Ответ

0 голосов
/ 01 июня 2018

Вызов client.recv(1024) заблокирует и вернет от 1 до 1024 байтов , если клиент не отключится, и в этом случае он вернет пустую строку:

def handle_client(client):
    while True:
        message = client.recv(BUFFER_SIZE)

        if not message:
            # client disconnected
            break

        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...