You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2.7实现TCP socket服务时,telnet输入UPPER/LOWER无响应

异常原因定位
  • 核心匹配逻辑失效:通过telnet发起TCP交互时,每输入指令按下回车,客户端会自动将指令文本连同回车产生的控制符(通常为\r\n)一并发送到服务端,此时recv()获取到的实际数据为UPPER\r\n,和代码中写的严格相等判断data == 'UPPER'永远无法匹配,自然不会触发对应分支的响应返回逻辑。
  • 缺失连接状态判断:当客户端主动断开连接时,recv()会返回空字符串,原代码未对空值做判断,既不会正常退出循环,也不会触发连接关闭流程,会陷入无提示的阻塞等待状态。
  • 响应格式不匹配:哪怕指令匹配成功,原代码返回的响应内容未加换行符,在telnet终端下会显示为无换行的粘连内容,交互体验和预期差异极大。
修复方案

对逻辑做三点调整即可:

  • 拿到接收数据后先剥离前后的回车、换行、空白字符,再做指令匹配
  • 增加空数据判断,识别客户端主动断开的场景,正常退出循环
  • 给返回的响应内容补充末尾换行符,适配telnet的显示逻辑

修复后的可运行代码如下:

#!/usr/bin/env python

import socket


TCP_IP = '127.0.0.1'
TCP_PORT = 5005
BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print 'Connection address:', addr
conn.sendall('Available commands: UPPER, LOWER\n')
while 1:
    data = conn.recv(BUFFER_SIZE)
    # 识别客户端断开连接的场景
    if not data:
        break
    # 剥离输入附带的控制符后再做指令判断
    trimmed_cmd = data.strip()
    if trimmed_cmd == 'UPPER':
        conn.sendall('Upper Case\n')
    elif trimmed_cmd == 'LOWER':
        conn.sendall('Lower Case\n')
    elif trimmed_cmd == 'QUIT':
        break
    print "received raw data:", repr(data)
conn.close()

运行验证:重启服务后重新通过telnet连接,输入UPPER/LOWER即可收到对应响应,输入QUIT可正常触发连接关闭流程,不会出现无反馈的挂起状态。

内容的提问来源于stack exchange,提问作者jasivo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.26 02:45:03