【问题标题】:Python server echos before hitting the enter keyPython 服务器在按下回车键之前回显
【发布时间】:2016-04-05 18:25:04
【问题描述】:

我遇到了一个奇怪的问题,我不知道是什么原因!实际上,我已经用 Python 编写了一个简单的服务器,它会响应客户端输入的任何内容。为了测试它,我通过telnet连接到服务器,但是一输入一个字符,它就会被回显!我不知道如何阻止它!实际上我想完成一个单词,然后按回车键,我的服务器会回显它。 这是我的简单服务器:

import socket
import sys

HOST = ''   # Symbolic name meaning all available interfaces
PORT = 5000 # Arbitrary non-privileged port

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'

try:
    s.bind((HOST, PORT))
except socket.error , msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

print 'Socket bind complete'

s.listen(10)
print 'Socket now listening'

#now keep talking with the client
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])

    while True:
        data = conn.recv(1024)
        reply = 'OK...' + data
        if not data: 
            break     
        conn.sendall(reply)

conn.close()
s.close()

【问题讨论】:

  • conn.recv() 不等待换行符。
  • 那我可以用什么代替呢?等待换行符的东西
  • 我也有这个问题,必须在服务器端解决它是一件痛苦的事。问题是这样的:在 Mac 中,telnet 以线路模式打开。您还可以指定模式行或模式字符。但是在 Windows Telnet 上,它以字符模式打开,并且没有模式命令可以更改它!!!事实上,我还没有找到在 Windows (XP) telnet 中获取 linemode 的任何方法!

标签: python telnet


【解决方案1】:

根据telnet 手册页,客户端尝试进入行模式,如果远程服务器不支持,将回退到字符模式:

一旦打开连接,telnet 将尝试启用 TELNET LINEMODE 选项。如果失败,则 telnet 将恢复为两种输入模式之一:“一次一个字符”或“逐行旧”,具体取决于远程系统支持的内容。

您可以将您的服务器端代码更改为与客户端握手以启用逐行,或者您可以强制客户端使用“旧”逐行模式,它在本地缓冲字符,并一次性发送。

要执行前者,您应该能够在初始连接后以found here 发送以下字节序列:

0x255 0x253 0x34

要执行后者,您可以执行(先按 ctrl 右括号),这将在 telnet 客户端中启用此模式(假设您使用的是 BSD telnet 命令 - 在 Windows 上可能会有所不同)。

^]toggle localchars

【讨论】:

  • 可以更改他的服务器代码来解析数据并等待它得到一个换行符。
  • 是的,马丁,我之前已经检查过这个问题,但它无法解决我的问题。正如你所提到的,我想我必须找到一种方法来阻止我的终端立即发送击键,但我不知道如何!
  • 更改了我的答案 - 似乎有服务器端支持或客户端支持。
  • 嘿马丁,感谢您的帮助,但最终我通过更改代码解决了问题,正如 Barmar 所说。实际上,我缓冲了所有接收到的数据,并且在接收到“返回”后,所有的数据都会被回显。
猜你喜欢
  • 1970-01-01
  • 2018-11-25
  • 2019-12-23
  • 2014-06-08
  • 1970-01-01
  • 2020-09-25
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多