如何使用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
。
通过应用级网络协议实现更高级别,例如HTTP
、FTP
等。
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
) 协议依赖于套接字。 套接字是基本构建块,从中定义了HTTP
、HTTPS
、FTP
、SMTP
协议(所有这些都是 TCP 类型的协议)。
DNS
、DHCP
、VOIP
协议是 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 我没试过,但是你可以用通常的方法来实现它,即在以上是关于如何使用python套接字从html获取输入的主要内容,如果未能解决你的问题,请参考以下文章
Python中的UDP套接字:如何清除缓冲区并忽略oldes消息