发送短信" http"在python套接字上

时间:2014-02-27 23:56:22

标签: python sockets http browser response

我正在尝试使用python创建HTTP服务器。问题是除了发送响应消息之外,我正在努力工作;如果邮件包含文字http,则send()无效。

以下是代码片段:

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 ...'

enter image description here

enter image description here

文字为'HTTP / 1.1 ...'

enter image description here

enter image description here

hello.html的HTML代码

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

2 个答案:

答案 0 :(得分:10)

您没有返回正确形成的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/是了解您选择使用的协议的许多平易近人的方法之一。祝你好运!

答案 1 :(得分:0)

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

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