2017-02-15 1 views
0

J'ouvre CMD et de créer une connexion telnet avec:Comment puis-je recevoir plus d'un caractère à la fois à partir du serveur Telnet?

telnet localhost 5555

Et la connexion ouvrira avec l'impression du serveur « Bienvenue » comme vous pouvez le voir dans l'image ci-dessous

enter image description here

Cependant, lorsque je tape sur la fenêtre telnet, il envoie la réponse un caractère à la fois plutôt que dans des phrases complètes (par exemple je vais taper bonjour et il envoie bonjour un caractère à la fois), comme ceci:

SERVEROUTPUT: h SERVEROUTPUT: e SERVEROUTPUT: l SERVEROUTPUT: l SERVEROUTPUT: o

Je le veux envoyer le mot entier bonjour ou une phrase complète plutôt que d'envoyer un caractère à la fois.

Comment est-ce que je peux faire ceci?

Voici le code:

import socket 
import sys 
from _thread import * 


host = '' 
port = 5555 

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

try: 
    s.bind((host, port)) 
except socket.error as e: 
    print(str(e)) 

s.listen(1) 

def threaded_client(conn): 
    conn.send(str.encode('Welcome, type your info\n')) 

    while True: 
     print("Waiting for input") 
     data = conn.recv(1024) 
     print("Data: ", data) 
     reply = 'Server output: ' + data.decode('utf-8') 
     if not data: 
      break 
     conn.sendall(str.encode(reply)) 
    conn.close() 


while True: 
    conn, addr = s.accept() 
    print('connected to: '+addr[0]+':'+str(addr[1])) 
    start_new_thread(threaded_client, (conn,)) 

Merci

+0

Je pense que le Telnet envoie un caractère à la fois et il n'y a pas grand-chose que vous pouvez faire à ce sujet. Soit vous pouvez utiliser un autre clone Telnet qui le permet soit du côté Python, vous pouvez utiliser un tampon et attendre un caractère '\ n' pour analyser la ligne. – piertoni

+0

Je pense que vous devriez configurer votre client telnet. Cependant, ce ne sera pas une solution fiable parce que TCP (référencé par 'SOCK_STREAM') n'a pas la notion de" message "- la connexion est un flux d'octets, donc vous ne pouvez pas" séparer "les messages, même si le client et serveur sont prêts à le faire. Vous pouvez toutefois détecter les caractères de nouvelle ligne et les traiter comme des limites de message. – yeputons

+1

Je suis confus. Vous utilisez un client telnet pour parler au programme que vous nous avez montré? C'est important de mentionner. C'est un peu déroutant de suggérer que vous parlez avec un serveur Telnet régulier quand vous n'êtes pas. Telnet a tendance à envoyer des caractères dès que vous les tapez et les serveurs Telnet ont tendance à les renvoyer immédiatement parce que c'est ainsi que vous pouvez voir ce que vous tapez. Vous pouvez changer votre programme pour attendre que des lignes entières soient reçues avant de faire écho, mais alors la personne qui tapera sur le client telnet ne verra pas ce qu'il écrit. – tdelaney

Répondre

1

Comme suggéré dans les commentaires, vous devez coder la logique pour accumulation de données. Quelque chose comme:

line = "" 
while True: 
    data = conn.recv(1024) 
    for c in data: 
     if c == ord('\n'): 
      print "message: " + line 
      line = "" 
     else: 
      line = line + c 
    if not data: 
     break 
+0

'\ n' n'est pas un délimiteur de fin de paquet telnet. 'data = conn.recv (1024)' signifiant 1024 octets de longueur, comment comparer un tableau d'octets à un caractère char? – dsgdfg

+0

@dsgdfg merci, vous avez raison, je n'ai pas remarqué que c'est python 3. –