Как вытащить данные из метода handle() в socketsеrver?

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
Добрый день. Подскажите, как получить переменную self.data из метода handle() в классе TCP_server_test(socketserver.BaseRequestHandler)? Пример взял из документации по socketserver. Спасибо.

Python:
import threading
import socketserver

class TCP_server_test(socketserver.BaseRequestHandler):

    def handle(self):
        self.data = str(self.request.recv(1024), 'utf-8')
        if self.data:
            thread = threading.current_thread()
            response = bytes("Поток {} с номером {}: {}".format(thread.name, thread.ident, self.data), 'utf-8')
            self.request.sendall(response)
            print("Инфа клиента:", self.data)

            # Проверка сколько запущенных потоков
            print("Запущенные потоки")
            for thread in threading.enumerate():
                print(thread.name)
        else:
            print("Нет соединения с клиентом")
        return

class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

if __name__ == '__main__':
    HOST, PORT = "127.0.0.1", 5000
    server = ThreadedTCPServer((HOST, PORT), TCP_server_test)
    #srv = TCP_server_test()
    while server:
        server_thread = threading.Thread(target=server.handle_request())

        server_thread.daemon = True
        server_thread.start()
        #print(srv.data)
Package Version
------------- -------------
-yqt5 5.15.0
click 7.1.2
pip 20.1.1
PyQt5 5.13.2
PyQt5-sip 12.8.0
pyqt5-tools 5.13.2.1.6rc1
python-dotenv 0.14.0
setuptools 49.1.0

Windows 7
Python 3.8
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Вы запустили сервер, но сам клиент подключается к серверу? Это клиент отправляет данные, если его нет, то ничего и не будет в self.data
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
Прошу прощения вот клиент
Python:
import socket, time

def client(ip, port, message):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        sock.connect((ip, port))
        time.sleep(3)
        print("Первый клиент подцепился")
        sock.sendall(bytes(message, 'utf-8'))
        response = str(sock.recv(1024), 'utf-8')
        print("Ответ: {}".format(response))

ip = "127.0.0.1"
port = 5000
i = 1

while i < 12:
    client(ip, port, "Я первый клиент {}".format(i))
    i += 1
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
А что не так с кодом? Я вот запустил его у себя, отдельно server.py и client.py копируя код выше и вот результат:

Сервер:
Код:
Инфа клиента: Я первый клиент 1
Запущенные потоки
MainThread
Thread-1
Инфа клиента: Я первый клиент 2
Запущенные потоки
MainThread
Thread-3
Инфа клиента: Я первый клиент 3
Запущенные потоки
MainThread
Thread-5
Инфа клиента: Я первый клиент 4
Запущенные потоки
MainThread
Thread-7
Инфа клиента: Я первый клиент 5
Запущенные потоки
MainThread
Thread-9
Инфа клиента: Я первый клиент 6
Запущенные потоки
MainThread
Thread-11
Инфа клиента: Я первый клиент 7
Запущенные потоки
MainThread
Thread-13
Инфа клиента: Я первый клиент 8
Запущенные потоки
MainThread
Thread-15
Инфа клиента: Я первый клиент 9
Запущенные потоки
MainThread
Thread-17
Инфа клиента: Я первый клиент 10
Запущенные потоки
MainThread
Thread-19
Инфа клиента: Я первый клиент 11
Запущенные потоки
MainThread
Thread-21

Клиент
Код:
Первый клиент подцепился
Ответ: Поток Thread-1 с номером 140307035141888: Я первый клиент 1
Первый клиент подцепился
Ответ: Поток Thread-3 с номером 140307035141888: Я первый клиент 2
Первый клиент подцепился
Ответ: Поток Thread-5 с номером 140307035141888: Я первый клиент 3
Первый клиент подцепился
Ответ: Поток Thread-7 с номером 140307035141888: Я первый клиент 4
Первый клиент подцепился
Ответ: Поток Thread-9 с номером 140307035141888: Я первый клиент 5
Первый клиент подцепился
Ответ: Поток Thread-11 с номером 140307035141888: Я первый клиент 6
Первый клиент подцепился
Ответ: Поток Thread-13 с номером 140307035141888: Я первый клиент 7
Первый клиент подцепился
Ответ: Поток Thread-15 с номером 140307035141888: Я первый клиент 8
Первый клиент подцепился
Ответ: Поток Thread-17 с номером 140307035141888: Я первый клиент 9
Первый клиент подцепился
Ответ: Поток Thread-19 с номером 140307035141888: Я первый клиент 10
Первый клиент подцепился
Ответ: Поток Thread-21 с номером 140307035141888: Я первый клиент 11
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
Не пойму как получить self.data, чтобы использовать ее вне класса TCP_server_test
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Не пойму как получить self.data, чтобы использовать ее вне класса TCP_server_test
Можете попробовать просто в переменную записать эти данные:
Python:
import threading
import socketserver

data_ = []

class TCP_server_test(socketserver.BaseRequestHandler):

    

    def handle(self):
        self.data = str(self.request.recv(1024), 'utf-8')
        if self.data:
            data_.append(self.data)
            thread = threading.current_thread()
            response = bytes("Поток {} с номером {}: {}".format(thread.name, thread.ident, self.data), 'utf-8')
            self.request.sendall(response)
            print("Инфа клиента:", self.data)

            # Проверка сколько запущенных потоков
            print("Запущенные потоки")
            for thread in threading.enumerate():
                print(thread.name)
        else:
            print("Нет соединения с клиентом")
        return



class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
    pass

if __name__ == '__main__':
    HOST, PORT = "127.0.0.1", 5000
    server = ThreadedTCPServer((HOST, PORT), TCP_server_test)
    #srv = TCP_server_test()
    while server:
        server_thread = threading.Thread(target=server.handle_request())

        server_thread.daemon = True
        server_thread.start()
        #print(srv.data)
        print(data_)
 

Форум IT Специалистов