2017-02-15 23 views
0

我打开CMD,并创建一个telnet连接:如何从telnet服务器一次接收多个字符?

telnet localhost 5555

,连接将与服务器打印打开“欢迎光临”,你可以下面的图片

enter image description here

然而,当我在telnet窗口上键入时,它一次发送一个字符而不是完整的句子(例如,我会输入hello并一次向您发送全球一个字符),如下所示:

SERVEROUTPUT:H SERVEROUTPUT:电子SERVEROUTPUT:L SERVEROUTPUT:L SERVEROUTPUT:○

我想它来发送完整的单词招呼,或者一个完整的句子,而不是一次发送一个字符。

我该怎么做?

下面的代码:

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

我认为Telnet一次只发送一个字符,对此您可以做的并不多。要么你可以使用另一个允许这个或者在Python端的Telnet克隆,你可以使用一个缓冲区并等待一个'\ n'字符来分析这条线。 – piertoni

+0

我想你应该配置你的telnet客户端。然而,它不是一个可靠的解决方案,因为TCP(由SOCK_STREAM引用)没有“消息”的概念 - 连接是一个字节流,所以你不能可靠地“分离”消息,即使客户端和服务器愿意这样做。不过,您可以检测换行符并将它们视为消息边界。 – 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。 –

相关问题