1

我正在尝试使用 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:连接已重置。这是为什么?

4

2 回答 2

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 开始。

于 2012-04-12T20:26:25.467 回答
0

您不能同时指定“Content-Type”字段和 HTML5 Doctype。

于 2012-04-12T20:12:44.083 回答