Как исправить многопроцессорный эхо-сервер для обработки нескольких клиентов - PullRequest
0 голосов
/ 11 января 2019

Я хочу создать многопроцессорный эхо-сервер. В настоящее время я использую telnet в качестве моего клиента для отправки сообщений на мой эхо-сервер. В настоящее время я могу обработать один запрос telnet, и он повторяет ответ. Сначала я думал, что должен инициализировать pid всякий раз, когда создаю сокет. Это правильно?

Как разрешить нескольким клиентам подключаться к моему серверу с помощью многопроцессорной обработки.

#!/usr/bin/env python
import socket
import os
from multiprocessing import Process

def create_socket():

    # Create socket
    sockfd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Port for socket and Host
    PORT = 8002
    HOST = 'localhost'

    # bind the socket to host and port
    sockfd.bind((HOST, PORT))
    # become a server socket
    sockfd.listen(5)

    start_socket(sockfd)

def start_socket(sockfd):

    while True:

        # Establish and accept connections woth client
        (clientsocket, address) = sockfd.accept()

         # Get the process id.
        process_id = os.getpid()
        print("Process id:", process_id)

        print("Got connection from", address)
        # Recieve message from the client
        message = clientsocket.recv(2024)
        print("Server received: " + message.decode('utf-8'))
        reply = ("Server output: " + message.decode('utf-8'))
        if not message:
            print("Client has been disconnected.....")
            break
        # Display messags.
        clientsocket.sendall(str.encode(reply))

    # Close the connection with the client
    clientsocket.close()

if __name__ == '__main__':

    process = Process(target = create_socket)     
    process.start()

Ответы [ 2 ]

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

Вероятно, стоит понять, какие блокируют системные вызовы, а какие нет. Например, listen не блокирует, а accept блокирует. Так что в основном - вы создали один процесс через Process(..), который блокирует на accept, а когда соединение установлено - обрабатывает это соединение.

Ваш код должен иметь структуру - что-то вроде следующего (псевдокод)


def handle_connection(accepted_socket):
    # do whatever you want with the socket
    pass

def server():

    # Create socket and listen to it. 
    sock = socket.socket(....)
    sock.bind((HOST, PORT))
    sock.listen(5)

    while True:
        new_client = sock.accept() # blocks here.

        # unblocked 
        client_process = Process(target=handle_connection, args=(new_client))
        client_process.start()

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

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

Начальная часть настройки сервера, привязки, прослушивания и т. Д. (Ваш create_socket) должна быть в основном процессе.

Как только вы accept и получите сокет, вы должны запустить отдельный процесс, чтобы позаботиться об этом соединении. Другими словами, ваш start_socket должен быть порожден в отдельном процессе и должен работать вечно.

...