2017-02-15 4 views
0

私はCMDを開き、とのTelnet接続の作成:telnetサーバーから一度に複数の文字を受信するにはどうすればよいですか?

telnet localhost 5555

をそして、あなたは

enter image description here

下の画像で見ることができるような接続は、サーバ印刷「ようこそ」と開きます。

しかし、私がtelnetウィンドウに入力すると、完全な文章ではなく、一度に1文字ずつ返信します(たとえば、私はhelloと入力し、一度にhello worldを送信します)。

SERVEROUTPUT:時間SERVEROUTPUT:EのSERVEROUTPUT:L serveroutputを:L serveroutputを:

oを私はそれが完全な単語ハローというか一度に一つの文字を送信するよりも、完全な文を送りたいです。

どうすればいいですか?

は、ここでは、コードです:コメントで示唆したように

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,)) 

おかげ

+0

私は一度に1つのチャットを送信すると思いますが、これについてできることはあまりありません。これを許可する別のTelnetクローンを使用するか、Python側でバッファを使用し、行を分析するために '\ n'文字を待つことができます。 – piertoni

+0

私はあなたのtelnetクライアントを設定すべきだと思います。しかし、TCP(SOCK_STREAMで参照される)は "message"という概念を持たないため、信頼できる解決策にはなりません。接続はバイトのストリームなので、クライアントとサーバーはそれを喜んで行います。ただし、改行文字を検出してメッセージ境界として扱うことはできます。 – yeputons

+1

私は混乱しています。 telnetクライアントを使用して、私たちに示したプログラムと話をしますか?それは言及することが重要です。あなたがそうでない時にあなたが普通のtelnetサーバーと話していることを示唆するのはちょっと混乱します。 Telnetは、入力するとすぐに文字を送信する傾向があり、Telnetサーバーは、入力した内容を確認する方法であるため、直ちに応答します。エコーする前に行全体が受信されるまで待つようにプログラムを変更することはできますが、telnetクライアントで入力した人は何を書き込むのか分かりません。 – tdelaney

答えて

1

、あなたは蓄積データするためのロジックをコーディングする必要があります。何かが好きです:

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'はtelnetパケット終了区切り文字ではありません。 'data = conn.recv(1024)' 1024バイトの長さを意味し、バイト配列をcharと比較する方法は? – dsgdfg

+0

@dsgdfgありがとう、そうです、私はそれがPython 3であることに気付かなかった。 –

関連する問題