Экран очистки cli каждый раз, когда я нажимаю клавишу

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

Connected with 127.0.0.1:56653

Теперь я использую netcat для тестирования в качестве клиента для подключения и отправки на сервер. Он будет печатать все, что я ему отправляю, но затем, как только я ввожу любой ключ на сервере, все это удаляется, как если бы я очистил экран.

import cmd2
import argparse
import sys
import socket
from _thread import *

def recv_data(conn, addr):
    while True:
        data = conn.recv(1024)
        print(data)

def accept_clients(sock):
    while True:
        conn, addr = sock.accept()

        print("\nConnected with %s:%s\n" % (addr[0], str(addr[1])))
        start_new_thread(recv_data, (conn,addr))

def start_socket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("Socket created")

    try:
        port = int(port)
    except ValueError:
        print("Invalid port number.")
        return

    try:
        sock.bind((ip, int(port)))
    except socket.error as msg:
        print("Bind failed. Error Code : %s" % (msg))
        return

    print("Socket bind complete")
    sock.listen(5)
    print("Socket now listening")

    start_new_thread(accept_clients, (sock,))


class CLI(cmd2.Cmd):
    def __init__(self):
        cmd2.Cmd.__init__(self)
        self.prompt = "Server> "


    def do_listen(self, arg):
        if not arg:
            arg = '-h'

        parser = argparse.ArgumentParser(description="Content goes here for information.", epilog="Examples and stuff go here.")
        parser.add_argument('-i', action='store', required=True, dest='ip', help='IP address to listen for connections.')
        parser.add_argument('-p', action='store', required=True, dest='port', help='Port to listen for connections.')
        results = parser.parse_args(arg.split())

        start_socket(results.ip, results.port)


    def do_quit(self, arg):
        sys.exit(1)
    def help_quit(self):
        print("Terminates the application.\n")

cli = CLI()
cli.cmdloop()

Обратите внимание на usre, если это связано, но я бы с осторожностью использовал from cmd2 import *, если вы используете только одну или две вещи (например, Cmd), если вы неожиданно загрязняете свое пространство имен.

match 31.10.2018 13:32

Я исправил это, но проблема все еще существует.

Doritos 31.10.2018 13:39

Есть и другие ошибки - где определяется recv_data? Убедитесь, что опубликованный код действительно то, что вы используете!

match 31.10.2018 13:44

Я добавил функцию, но она не нужна для воспроизведения проблемы. Без функции он выдаст ошибку, говоря, что не может найти функцию бла-бла. Но как только вы вернетесь на сервер и введете любой ключ, все это будет удалено и вернется к пустому запросу (Сервер>). Запустите это с помощью "listen -i localhost -p 5555" и подключитесь к netcat, отправьте некоторые данные, и сервер распечатает их, затем введите любой ключ на сервере, и он исчезнет.

Doritos 31.10.2018 13:49

Если recv_data не существует, вы не получите вывода на сервере, поскольку нет метода, обрабатывающего полученные данные. Опубликуйте полный пример, включая метод recv_data, иначе мы не сможем отладить проблему!

match 31.10.2018 13:55

Как упоминалось выше, я добавил функцию. И сервер по-прежнему будет выводить ошибку на stdout серверов. Которая будет удалена при вводе любого ключа на сервере.

Doritos 31.10.2018 13:57

У меня нет проблемы, которую вы описываете - когда я отправляю texct с помощью nc, она появляется на консоли сервера - если я затем набираю что-нибудь (например, `` помощь ''), это (и полученный результат) появляются в строке ниже с исходным выход остался нетронутым. Это python 3.6.6 с cmd2, загруженным через pip, если это имеет значение?

match 01.11.2018 11:09
1
7
44
0

Другие вопросы по теме