【发布时间】: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