【问题标题】:Send text "http" over python socket通过 python 套接字发送文本“http”
【发布时间】:2014-03-31 18:12:19
【问题描述】:

我正在尝试使用 python 创建一个 HTTP 服务器。问题是除了发送响应消息外,我正在让一切正常工作;如果消息中有文字http,则send() 不起作用。

这里是sn-p的代码:

connectionSocket.send('HTTP/1.1 200 OK text/html')

这是我尝试过的其他方法:

connectionSocket.send(''.join('%s 200 OK text/html' % ('HTTP/1.1')))
connectionSocket.send('%s 200 OK text/html' % ('HTTP/1.1'))
msg = 'HTTP/1.1 200 OK text/html'
for i in range(0, len(msg))
    connectionSocket.send(msg[i])

似乎唯一可行的方法是实体化HTTP 中的任何字符,例如

connectionSocket.send('HTTP/1.1 200 OK text/html')

其中H 等同于H。否则浏览器不会显示从 python 服务器套接字接收到的标头。

当我尝试通过套接字发送404 Message 时,问题也会出现。但是,显示其他内容,就像通过套接字发送的 html 文件一样。

我想知道有没有合适的方法呢?因为,如果客户端不是浏览器,html实体是不会被理解的。

提前致谢

更新:

代码:

from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)

serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('127.0.0.1', 1240))
serverSocket.listen(1);

while True:
  print 'Ready to serve...'
  connectionSocket, addr = serverSocket.accept()
  try:
    message = connectionSocket.recv(1024)
    filename = message.split()[1]
    f = open(filename[1:])
    outputdata = f.read()

    #Send one HTTP header line into socket
    connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working

    #Send the content of the requested file to the client
    for i in range(0, len(outputdata)):
        connectionSocket.send(outputdata[i])
    connectionSocket.close()

  except IOError:
    connectionSocket.send('HTTP/1.1 404 File not found') ## this is not working
    connectionSocket.close();

serverSocket.close()

截图:

文本为“HTTP/1.1 ...”

文本为“HTTP/1.1 ...”

hello.html的HTML代码

<html>
  <head>
    <title>Test Python</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>

【问题讨论】:

  • 我很难相信字符串http是socket无法发送问题的根源。
  • @PauloBu 这是我首先想到的,但是,其他元素显示正确。代码发送从文件中读取的 html 数据,浏览器正常显示,除了 http 头。
  • 但是浏览器不应该显示http头不是吗?
  • 请提供足够的信息来重现问题。告诉我们您正在使用哪些库等。
  • 有效的 HTTP 被浏览器剥离 - 这就是浏览器与服务器通信的方式。如果您看到呈现的 html,那么它可能正在工作

标签: python sockets http browser response


【解决方案1】:

您没有返回格式正确的 HTTP 响应。你的线路

connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working

甚至不会被换行符终止,然后紧跟文件内容。 HTTP 之类的协议相当严格地指定必须发送的内容,我发现您在浏览器中看到任何内容简直是奇迹。

尝试类似:

connectionSocket.send('HTTP/1.1 200 OK\nContent-Type: text/html\n\n')

这是格式正确的 HTTP 1.1 响应的开始,其中包含一个主响应行和一个标头。双换行符终止标头,让客户端准备读取随后的内容。

http://www.jmarshall.com/easy/http/ 是了解更多有关您选择使用的协议的许多平易近人的方法之一。祝你好运!

【讨论】:

  • 谢谢,效果很好。我使用了connectionSocket.send('HTTP/1.1\n\n 200 OK Content-Type: text/html');,它显示了从 200 到 text/html 的所有内容。但是,它没有显示HTTP/1.1,正如你们所说,它被剥离了。
  • "\n\n" 正在提前终止 HTTP 响应。查看tcpipguide.com/free/t_HTTPResponseMessageFormat.htm 以了解您应该发送的内容 - 在这里坚持正确的格式非常重要,您不能随心所欲地编造,一点阅读将节省您很多时间。
【解决方案2】:

我不确定您使用的是什么 connectionSocket(哪个模块、库等),但如果这个东西已经是 HTTP 相关例程的一部分,那么很可能它已经发送了必要的 @987654322 @线没有你做。那么你的可能会干扰这个过程。

引用的版本 (&amp;#72;TTP...) 可能无法被浏览器中的 HTTP 协议识别(我认为引用仅在 OSI 堆栈的更高层中被识别和解释),因此不具有相同的效果。

【讨论】:

  • 图书馆是socketfrom socket import *。请你说的更清楚一些,我不明白你说的格式是否正确。 “引用的版本(HTTP...)可能无法被浏览器中的 HTTP 协议识别”——引用的版本是有效的。其他人没有。
  • connection_socket 是代码中accept() 调用返回的套接字。这不是问题。
  • 是的,我的想法显然是错误的,如果你直接使用socket.socket。我认为将HTTP 显式附加到隐式HTTP 假定的底层库会自动生成(socket.socket 当然不是这种情况)会导致加倍,从而导致问题。然后以引用的形式明确给出它会使隐含的部分保持完整,从而掩盖问题。你没有马上这么说,但现在我猜 没有 引用的版本(即也没有未引用的版本)它也不起作用。我说的对吗?
猜你喜欢
  • 2015-08-28
  • 2021-07-06
  • 1970-01-01
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2013-03-15
相关资源
最近更新 更多