python - 为什么我的 Python 套接字网络服务器代码失败?

标签 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:连接已重置。这是为什么?

最佳答案

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

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

关于python - 为什么我的 Python 套接字网络服务器代码失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10130874/

相关文章:

node.js - 在Socket.io演示中集成QT客户端

python - 为什么我的 Spark DataFrame 比 RDD 慢很多?

http - 移动浏览器和 HTTP 压缩 (gzip)

java - Apache HttpClient ResponseHandler 异常

Android - HTTP 获取自签名

python - 如何在等待接收数据时关闭阻塞套接字?

python - 将字符串列表转换为 int 或 float

python - 防止 python 导入编译

python - Google BigQuery 从 Python 脚本执行 SQL 文件

Python socketserver不同的任务