【问题标题】:How can I receive more than one character at a time from telnet server?如何从 telnet 服务器一次接收多个字符?
【发布时间】:2017-07-03 16:51:24
【问题描述】:

我打开 CMD 并创建一个 telnet 连接:

telnet localhost 5555

如下图所示,连接将打开,服务器打印“欢迎”

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

服务器输出:h 服务器输出:e 服务器输出:l 服务器输出:l 服务器输出:o

我希望它发送完整的单词 hello 或完整的句子,而不是一次发送一个字符。

我该怎么做?

代码如下:

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

谢谢

【问题讨论】:

  • 我认为 Telnet 一次发送一个字符,对此您无能为力。您可以使用另一个允许此操作的 Telnet 克隆,或者在 Python 端,您可以使用缓冲区并等待“\n”字符来分析该行。
  • 我认为你应该配置你的 telnet 客户端。但是,它不会是一个可靠的解决方案,因为 TCP(由 SOCK_STREAM 引用)没有“消息”的概念 - 连接是字节流,因此您不能可靠地“分离”消息,即使客户端和服务器愿意这样做。不过,您可以检测换行符并将它们视为消息边界。
  • 我很困惑。您使用 telnet 客户端与您向我们展示的程序交谈?值得一提的是。建议您在与常规 telnet 服务器通话时不使用它,这有点令人困惑。 Telnet 倾向于在您键入字符后立即发送字符,而 telnet 服务器倾向于立即回显它们,因为这样您就可以看到您正在键入的内容。您可以将程序更改为等到收到整行后才回显,但是在 telnet 客户端上打字的人将看不到他们写的内容。

标签: python python-3.x sockets telnet


【解决方案1】:

按照 cmets 中的建议,您需要编写累积数据的逻辑。比如:

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

【讨论】:

  • \n 不是 telnet 数据包结束分隔符。 data = conn.recv(1024) 表示1024字节长度,如何比较字节数组和char?
  • @dsgdfg 谢谢,你说得对,我没注意到它是 python 3。
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2011-06-11
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多