如何使用python套接字从html获取输入

Posted

技术标签:

【中文标题】如何使用python套接字从html获取输入【英文标题】:how to get input from html using python socket 【发布时间】:2015-12-13 22:26:03 【问题描述】:

我有一个代码可以在 localhost 上启动一个简单的套接字服务器。但是,我希望它在通过浏览器访问时显示一个 html 页面。 html 将包含两个文本字段和提交按钮。当用户在文本字段中输入文本并单击提交按钮时,我希望程序从文本字段中读取。我该怎么做?

【问题讨论】:

你可以使用python启动简单的HTTPServer/baseHTTPServer 是的,我知道,但我希望它是一个 Socket 服务器。这是我项目的要求 为什么看不到 BaseHTTPServer.py 的源代码?它使用套接字模块 我害怕以我目前对套接字的了解我无法理解它 @TalhaAhmad 还是看看吧!不会疼的。 【参考方案1】:

您的问题的即时答案(我希望如此)在最后一部分 答案 - 如果我对您的问题的解释有误,让我知道在评论部分


混乱 - 你混淆了基础 - 要显示一个 html 页面,你只需要一个服务器(在你的例子中是本地主机),浏览器将使用 HTTP/HTTPS获取该内容/响应/html页面的协议。在 Python 中(其他语言几乎相同)有两个级别的网络服务访问:

低级通过sockets。 通过应用级网络协议实现更高级别,例如HTTPFTP 等。

Sockets - 简单地说,它是机器操作系统提供的一种功能(接口),用于实现客户端和服务器(对于更高级别的网络协议),如进程之间的通信。这些进程可以在同一台机器上运行,也可以两个进程在物理上分开的机器上运行(例如,使用浏览器请求网站)。

典型的套接字客户端是(从浏览器请求所需的 html):

client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_sock.connect(("localhost", 80))

但要使其正常工作,您必须已经运行服务器(它将为 html 提供服务):

server_sock = socket.socket()     # Create a socket object
server_sock.bind((localhost, 80)) # Bind to the port
server_sock.listen(5) 
while True:
     # lines for whatever we want server to do  

server_sock.bind((localhost, 80)) 行已将 localhost:80(套接字基本上是 'host_name:port_number')绑定(分配/分配)到此 server_sock,即对 localhost:80 的任何调用/请求都将按照以上代码的while True:块中的行,可以是文本响应、HTML等。


典型网络场景 - 我们输入网站名称 www.google.com(通过 DNS 协议解析为 IP - 完全是另一回事)和点击回车,我们将得到谷歌的搜索主页作为响应 - 这里你是客户端,输入网站名称并点击回车在技术上是client_sock.connect('www.google.com', 80),它只工作因为在另一台(远程)机器/系统/主机他们有server_socket 绑定和监听,即

server_sock.bind('machine's_IP', 80)
server_sock.listen(5)
while True:
    #accept connections from outside
    (client_socket, address) = server_socket.accept()

    # here will be the lines which send us back the Google's 
    # homepage html as a response to our web request.

总而言之,可以使用(几乎)任何编程语言来实现服务器(在您的情况下为网络服务器),例如python或C等,但基础,最低层,数据在两个进程之间传递的确切位置,无论是在同一台机器上使用locahost(环回)还是在物理上分开的机器/主机上运行的每个进程(典型的Web场景)通过HTTP (TCP) 协议依赖于套接字。 套接字是基本构建块,从中定义了HTTPHTTPSFTPSMTP 协议(所有这些都是 TCP 类型的协议)。

DNSDHCPVOIP 协议是 UDP 协议,但它们也是建立在套接字之上的。


答案 - 首先,创建一个 web_server.py 并粘贴以下代码(只是为了看看它是如何工作的)并将文件作为脚本运行,即从文件的位置运行“python

web_server.py" 在命令提示符/终端中:

#!/usr/bin/env python
import socket

host = 'localhost'
port = 80
server_sock = socket.socket(socket.AF_INET,\
                            socket.SOCK_STREAM)    # Create a socket object
server_sock.bind((host , port))                    # Bind to the port

print 'Starting server on', host, port
print 'The Web server URL for this would be http://%s:%d/' % (host, port)

server_sock.listen(5)             # Now wait for client connection.

print 'Entering infinite loop; hit CTRL-C to exit'
while True:
    # Establish connection with client.    
    client_sock, (client_host, client_port) = socket.socket.accept()
    print 'Got connection from', client_host, client_port
    client_sock.recv(1000) # should receive request from client. (GET ....)
    client_sock.send('HTTP/1.0 200 OK\n')
    client_sock.send('Content-Type: text/html\n')
    client_sock.send('\n') # header and body should be separated by additional newline
    # you can paste your 2 text field html here in the <body>
    client_sock.send("""
        <html>
        <body>
        <h1>Hello World</h1> this is my server!
        </body>
        </html>
    """) 
    client_sock.close()

P.S.你必须实现一个HTTP服务器(webserver)——它肯定会使用最低级别的套接字接口,即

server_sock.bind
server_sock.listen
server_sock.accept 

【讨论】:

谢谢,这真的很有帮助,我已经向浏览器发送了一个 html 表单,但是如何从表单中获取输入 我希望表单在用户按下提交按钮后将表单的数据传递给 python 我没试过,但是你可以用通常的方法来实现它,即在
标签中使用'action'属性。 'action=formprocessor.py' 的值可以是用于处理表单数据的 python 脚本 - 将 formprocessor.py 放在服务器脚本/文件所在的同一目录中。

以上是关于如何使用python套接字从html获取输入的主要内容,如果未能解决你的问题,请参考以下文章

如何重用TCP套接字python

如何使 html 文本输入只读但能够使用脚本进行更新?

Python中的UDP套接字:如何清除缓冲区并忽略oldes消息

如何使用网络库从函数外部获取更新值

Python如何从迭代中获取与subprocess.Popen一起运行的变量输入

如何使用 Python Twitch IRC Bot 获取聊天消息参数?