micropython-http

2024-05-18  本文已影响0人  yichen_china
import usocket as socket
import html.index  as html
def getHtml():
    return html.index()
def httpServer(ip,port):
    # 创建socket对象,设置为TCP类型
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定到本地IP地址和80端口
    print('Listening on http://',ip,":", port)
    s.bind((ip, port))
    # 开始监听连接请求,最大队列长度为5
    s.listen(5)
    return s
def listenHttp(s):
    # 接受一个客户端的连接请求,返回一个新的socket对象和客户端地址
    conn, addr = s.accept()
    # 打印客户端地址
    print('Got a connection from %s' % str(addr))
    # 接收客户端发送的数据,最多接收1024字节
    request = conn.recv(1024)
    # 打印客户端发送的数据
    print('Content = %s' % str(request))
    # 向客户端发送HTTP响应头和HTML页面内容
    conn.send('HTTP/1.1 200 OK\n')
    conn.send('Content-Type: text/html\n')
    conn.send('Connection: close\n\n')
    conn.sendall(getHtml())
    # 关闭连接
    conn.close()

html/Index.py

class Index:
    def __init__(self):
        pass
    def index(self):
            # 定义一个HTML页面的内容,用于返回给客户端
        return  """<!DOCTYPE html>
        <html lang="zh-CN" manifest="IGNORE.manifest">
            <head>
                <meta charset="utf-8">
                <meta http-equiv="X-UA-Compatible" content="IE=edge">
                <meta name="viewport"
                    content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
                <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
                <meta http-equiv="Pragma" content="no-cache" />
                <meta http-equiv="Expires" content="0" />
                <title>首页</title> 
            </head>
            <style>
                .form-item {
                    text-align: center;
                    line-height: 2em;
                }

                .form-item[type=button] {
                    line-height: 2em;
                }
                input{
                    line-height: 2em;
                }
                button {
                    padding: 5px;
                    width: 100%;
                    background-color: green;
                    color: white;
                    border: none;
                }

                button:hover {
                    background-color: green;
                }

                button:active {
                    background-color: #888;
                }

                button:disabled {
                    background-color: gray;
                    color: black;
                }
                form{
                    padding: 10px;
                    background-color: aliceblue;
                }
            </style>
            <body>
                <div style="display: flex;justify-content: center;width: 100vw;">
                    <form action="">
                        <div class="form-item" style="text-align: center;">
                            WIFI配置
                        </div>
                        <div class="form-item">
                            名称: <input type="text" name="firstname"><br>
                        </div>
                        <div class="form-item">
                            密码: <input type="text" name="lastname">
                        </div>
                        <div class="form-item">
                            <button type="button" value="确认">确认</button>
                        </div>
                        <div  class="form-item">
                            当前状态
                        </div>
                    </form>
                </div>
            </body>
        </html>
        """


WebService.py

import socket, time, re
#import socket
from html.Index import Index
class WebService:
    def __init__(self,IP="0.0.0.0",PORT=80,):
        self.IP = IP
        self.PORT = PORT
        self.CLIENT = None
        print("启动web服务器2")
    def run(self):
        webserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #创建套接字
        webserver.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  #设置给定套接字选项的值
        #webserver.settimeout(2000)
        #ip="192.168.4.1" #AP's IP
#         a=1
        webserver.bind((self.IP, self.PORT))                                       #绑定IP地址和端口号
        webserver.listen(5)                                              #监听套接字
        self.webserver=webserver
        print("web:",self.IP,":",self.PORT)
#         print(self.PORT)
        while True:
            conn, addr = webserver.accept()                                #接受一个连接,conn是一个新的socket对象
            self.CLIENT = conn
            self.ADDR =addr
            request = conn.recv(1024)                              #从套接字接收1024字节的数据
             # 打印客户端发送的数据
            print('Content = %s' % str(request))
            if len(request)>0:
                request = request.decode()
                result = re.search("(.*?) (.*?) HTTP/1.1", request)
                if result:
                    method = result.group(1)
                    url = result.group(2)
                    print(url)
                    payload = {}#将post数据存数组
                    if method == "POST":#获得post数据
                        print("POST")
                        postdata = re.search(".*?\r\n\r\n(.*)", request).group(1)
                        if postdata:
                            lists = postdata.split("&")
                            for list in lists:
                                k,v = list.split("=")
                                payload[k]=v
                      #print(payload)

                            #conn.sendall("HTTP/1.1 200 OK\nConnection: close\nServer: Esp8266\nContent-Type: text/html;charset=UTF-8\n\n")
#                             conn.send("HTTP/1.1 200 OK\r\n")
#                             conn.send("Server: Esp8266\r\n")
#                             conn.send("Content-Type: text/html;charset=UTF-8\r\n")
#                             conn.send("Connection: close\r\n")
#                             conn.send("\r\n")
                    if method == "GET":#获得get数据
                        print("GET")
                    conn.send('HTTP/1.1 200 OK\n')
                    conn.send('Content-Type: text/html\n')
                    conn.send('Connection: close\n\n')
                    print(url)
                    if url == "/":
                        print("url:/")
                        conn.sendall(Index().login())
                    elif url == "/login":
                        print("url:/login")
                        conn.sendall(Index().login())
#                         conn.send("\r\n")  # 发送结束
                    else:
                        print("not found url")
                else:
                    print("no request")
                    conn.close()
                    print("out %s" % str(addr))
#   测试方法 返回文档内容   httpServer(self,ip,port).listenHttp()
    def getHtml(self):
        Index().login();
#   简单实现web 服务
    def httpServer(self,ip,port):
        # 创建socket对象,设置为TCP类型
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 绑定到本地IP地址和80端口
        print('Listening on http://',ip,":", port)
        s.bind((ip, port))
        # 开始监听连接请求,最大队列长度为5
        s.listen(5)
        self.s=s
        return self
#   简单实现web端口监听
    def listenHttp(self):
        s=self.s
        # 接受一个客户端的连接请求,返回一个新的socket对象和客户端地址
        conn, addr = s.accept()
        # 打印客户端地址
        print('Got a connection from %s' % str(addr))
        # 接收客户端发送的数据,最多接收1024字节
        request = conn.recv(1024)
        # 打印客户端发送的数据
        print('Content = %s' % str(request))
        # 向客户端发送HTTP响应头和HTML页面内容
        conn.send('HTTP/1.1 200 OK\n')
        conn.send('Content-Type: text/html\n')
        conn.send('Connection: close\n\n')
        conn.sendall(self.getHtml())
        # 关闭连接


上一篇 下一篇

猜你喜欢

热点阅读