Как мой сокет-сервер может взаимодействовать с терминалом в главном потоке при обработке запросов? - PullRequest
0 голосов
/ 06 февраля 2019

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

import socket
import time
import threading



class threadedServer(object):
threads = []
messages = []
def __init__(self, host, port):
    self.host = host
    self.port = port
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.bind((self.host, self.port))

def listen(self):
    self.sock.listen(5)
    while True:
        conn, addr = self.sock.accept()
        print('Connected by ' + str(addr[0]) +':' + str(addr[1]))
        conn.settimeout(20)
        newThread = threading.Thread(group=None, target = self.ListenToClient,args = (conn,addr))
        newThread.start()
        threadedServer.threads.append(newThread)
        print(threading.enumerate())
def ListenToClient(self, conn, addr):
    while True:
        try:
            data = conn.recv(1024)
            if data:
                threadedServer.messages.append(data)
                print(threadedServer.messages)
                response = 'Recieved'
                conn.send(response.encode())
            else:
                raise error('Client Disconnected')
        except:
            conn.close()
            return False


def main():
beginning = input('\n1) Start Server \n2) Check Number of Connections \n>> ')
if beginning == '1':
    while True:
        port_num = input("Port? ")
        try:
            port_num = int(port_num)
            threadedServer('10.148.198.201',port_num).listen()

            break
        except ValueError:
            pass
elif beginning == '2':
    print('')
    print(threading.enumerate())
    print('')
    main()

if __name__ == '__main__':
main()

Несколько вопросов.Во-первых, после запуска сервера я бы хотел вернуться в меню параметров с такими параметрами, как завершение потока, взаимодействие с потоком, просмотр открытых текущих потоков и тому подобное.Что-то похожее на меню опций в начале main ().Также прямо сейчас все, что отправляется на сервер, помещается в список сообщений, я хотел бы иметь отдельный список для каждой открытой цепочки, в которую отправляются их сообщения.Моя идея заключается в том, что мой основной поток должен быть тем, в котором запущено меню параметров, и иметь потоки в фоновом режиме, которые прослушиваются и подключаются;Тем не менее, я не нашел способ изменить основной поток.Я на Windows.

1 Ответ

0 голосов
/ 06 февраля 2019

Пример Asynchronous Mixins в документации socketserver показывает, что именно вы хотите сделать: создать фоновый поток для запуска самого сервера, чтобы вы могли выполнять другие действия в основном потоке, покаСервер обрабатывает запросы.

Вот копия соответствующего бита из примера с комментарием, показывающим, куда вы добавили бы свой код:

if __name__ == "__main__":
    # Port 0 means to select an arbitrary unused port
    HOST, PORT = "localhost", 0

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
    with server:
        ip, port = server.server_address

        # Start a thread with the server -- that thread will then start one
        # more thread for each request
        server_thread = threading.Thread(target=server.serve_forever)
        # Exit the server thread when the main thread terminates
        server_thread.daemon = True
        server_thread.start()
        print("Server loop running in thread:", server_thread.name)

        # NOTE: You can interact with the console here

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