【问题标题】:Telnet to Python server gets stuckTelnet 到 Python 服务器卡住了
【发布时间】:2019-10-16 23:19:54
【问题描述】:

我正在准备一个演示,我想为它使用一个简单的服务器,而不是 nginx 或任何其他流行的服务器。

我从python官方页面得到以下一个:

import SimpleHTTPServer
import SocketServer

PORT = 8000

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

所以,我运行它,一切似乎都很好:

python -m SimpleHTTPServer 8000

如果我去浏览器,或者卷曲 IP 地址,它就可以正常工作:

xx.xx.xx.xx - - [31/May/2019 09:36:33] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:37:43] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:37:46] "HEAD / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:03] "HEAD / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:06] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:12] "GET / HTTP/1.1" 200 -
xx.xx.xx.xx - - [31/May/2019 09:39:13] "GET / HTTP/1.1" 200 -

现在,当我通过telnet 连接到服务器时,我使用GET,服务器卡住了:

$ telnet xx.xx.xx.xx 8000
Trying xx.xx.xx.xx...
Connected to xx.xx.xx.xx.
Escape character is '^]'.
GET / HTTP/1.1
...It just hangs here foever...

当我在服务器上点击ctrl+c 时,它显示发生了一个异常,我不知道如何在这种情况下解释:

^C----------------------------------------
Exception happened during processing of request from ('xx.xx.xx.xx', 47346)
Traceback (most recent call last):
  File "/usr/lib/python3.5/socketserver.py", line 313, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python3.5/socketserver.py", line 341, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python3.5/socketserver.py", line 354, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python3.5/socketserver.py", line 681, in __init__
    self.handle()
  File "/usr/lib/python3.5/http/server.py", line 422, in handle
    self.handle_one_request()
  File "/usr/lib/python3.5/http/server.py", line 400, in handle_one_request
    if not self.parse_request():
  File "/usr/lib/python3.5/http/server.py", line 334, in parse_request
    _class=self.MessageClass)
  File "/usr/lib/python3.5/http/client.py", line 206, in parse_headers
    line = fp.readline(_MAXLINE + 1)
  File "/usr/lib/python3.5/socket.py", line 576, in readinto
    return self._sock.recv_into(b)
KeyboardInterrupt
----------------------------------------

我还通过 SSH 连接到服务器正在运行的同一台机器上,并将请求连接到本地主机。也挂了。

我想知道:

  1. telnetGET 与其他 GET 有何不同。
  2. 在python服务器级别,异常是什么意思,如何解决。

【问题讨论】:

  • 您是否发送了 两个 \r\n 来完成请求?

标签: python telnet


【解决方案1】:
  1. telnet GET 与其他 GET 有何不同。

telnet 在这里没有什么不同。您的服务器挂起,因为它正在等待您完成输入 GET 请求。为此,您只需在输入 GET 请求后按两次Enter

这是因为:

  • 需要一个 CR-LF 字符来结束 HTTP 请求的消息头部分(指定为 here
  • 另一个是实际的CR-LF,它告诉telnet您输入完毕
  1. 在python服务器级别,异常是什么意思,如何解决。

这只是您按下Ctrl + C 的结果,从而中断了运行您的SimpleHTTPServer 的Python 进程。

【讨论】:

  • 对文本做出反应的不是telnet,而是远程服务器。
  • 是的,我知道,文本(我猜你的意思是异常)只是被抛出,因为你按下了 Ctrl+C。但是你的telnet 处理问题仅在客户端。请参阅上面的更新答案。
  • 谢谢,这就是问题所在。
  • "Telnet 挂起,因为它正在等待` - 不,它没有挂起,它正在完成它的工作,通过网络将您键入的所有内容中继到服务器并打印出服务器响应的所有内容。服务器卡住等待,因为您输入的 HTTP 请求尚未完成。
  • @tripleee 你是对的,我刚刚更新了上面的答案以使其更准确。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多