为什么我的Python套接字Web服务器代码失败了?

时间:2012-04-12 19:59:33

标签: python http sockets webserver

我正在尝试使用Python实现一个非常基本的类似Web服务器的应用程序,这是我目前的代码:

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
print 'Server is now running...'
while 1:
    connectionSocket, addr = serverSocket.accept()
    connectionSocket.sendall('''
        HTTP/1.0 200 OK\r\n
        Content-Type:text/html\r\n
        Connection:close\r\n
        \r\n
        <!DOCTYPE html>
        <head><title>Lab sign-up - AntonX Server</title></head>
        <h1>Lab Sign-up</h1>
        <table>
        <form action=\"localhost:12000\" method=\"GET\">
        <tr><td>Time</td><td>Name</td></tr>
        <tr><td>1 PM</td><td><input type=\"text\" name=\"time_1\"></td></tr>
        <tr><td>2 PM</td><td><input type=\"text\" name=\"time_2\"></td></tr>
        <tr><td>3 PM</td><td><input type=\"text\" name=\"time_3\"></td></tr>
        <tr><td>4 PM</td><td><input type=\"text\" name=\"time_4\"></td></tr>
        <tr><td>5 PM</td><td><input type=\"text\" name=\"time_5\"></td></tr>
        <tr><td colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"Steal this spot!\"></tr>
        </form></table>
        </html>\r\n
    ''')
    connectionSocket.close()

问题是......当我导航到localhost:12000时,出现错误101:连接已重置。那是为什么?

2 个答案:

答案 0 :(得分:2)

您要发回的数据有很多额外的空格和换行符。 例如,

'''
    HTTP/1.0 200 OK\r\n
    Content-Type:text/html\r\n'''

将发送字符串

(blank line)
(extra spaces)    HTTP/1.0 200 OK  
(blank line)
(extra spaces)    Content-Type:text/html

换句话说,您将获得已明确包含在\ r \ n中的新行以及源代码中自然包含的换行符。

此代码适用于我的网络浏览器。

from socket import *

serverPort = 12000
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
print 'Server is now running...'
while 1:
    connectionSocket, addr = serverSocket.accept()
    connectionSocket.sendall("HTTP/1.0 200 OK\r\n"+
                             "Content-Type: text/html\r\n"+
                             "Connection: close\r\n"+
                             "\r\n"+
        """<!DOCTYPE html>
        <head><title>Lab sign-up - AntonX Server</title></head>
        <h1>Lab Sign-up</h1>
        <table>
        <form action=\"localhost:12000\" method=\"GET\">
        <tr><td>Time</td><td>Name</td></tr>
        <tr><td>1 PM</td><td><input type=\"text\" name=\"time_1\"></td></tr>
        <tr><td>2 PM</td><td><input type=\"text\" name=\"time_2\"></td></tr>
        <tr><td>3 PM</td><td><input type=\"text\" name=\"time_3\"></td></tr>
        <tr><td>4 PM</td><td><input type=\"text\" name=\"time_4\"></td></tr>
        <tr><td>5 PM</td><td><input type=\"text\" name=\"time_5\"></td></tr>
        <tr><td colspan=\"2\"><input type=\"submit\" name=\"submit\" value=\"Steal this spot!\"></tr>
        </form></table>
        </html>\r\n
    """)
    connectionSocket.close()

(但是,这不是用Python编写Web服务器的好方法!)

您可能希望查看Python中的各种内置函数来帮助处理这种代码,可能从SimpleHTTPServer开始。

答案 1 :(得分:0)

您无法同时指定“内容类型”字段和HTML5文档类型。