查看: 3612|回复: 2
打印 上一主题 下一主题

Python实现http协议,简单的WebServer示例

[复制链接]

93

主题

100

帖子

2337

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2337
QQ
跳转到指定楼层
楼主
发表于 2018-11-20 21:28:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1. 服务端Server

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # www.etdev.net by respeke

  4. import socket
  5. import threading

  6. def tcp_thread(sock,addr):
  7.     print('accept new connection from %s,%s'%addr)

  8.     rh='HTTP/1.1 200 OK\r\n'
  9. #    rh+='Date: Thu, 08 Nov 2018 01:32:36 GMT\r\n'
  10.     rh+='Content-Type: text/html\r\n'
  11.     rh+='Connection: Keep-Alive\r\n'

  12.     rb='\r\n'
  13.     rb+='\r\n'
  14.     rb+='\r\n'
  15.     rb+='Python WebServer\r\n'
  16.     rb+='
  17. \r\n'
  18.     rb+='\r\n'
  19.     rb+='
    \r\n'
  20.     rb+='

    Welcome to www.etdev.net

    \r\n'
  21.     rb+='

    电子技术开发网 - ETDev,电子技术、嵌入式技术交流分享园地

    '
  22.     rb+='
\r\n'
  •     rb+='
  • \r\n'
  •     rb+='
  • '

  •     rh+='Content-Length: %d\r\n\r\n'%len(rb.encode('utf-8'))
  •    
  •     sock.send(bytes(rh+rb,encoding='utf-8'))
  •     while True:
  •         date=sock.recv(1024)
  •         if not date or date.decode('utf-8')=='exit':
  •             break
  •         print(date.decode('utf-8'))

  •     sock.close()

  • def start_tcp_server(ip,port):
  •     #create socket
  •     s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  •     #bind port
  •     server_addr=(ip,port)
  •     s.bind(server_addr)
  •     #starting listening, allow 10 connection
  •     try:
  •         print ("starting listen on ip %s, port %s"%server_addr)
  •         s.listen(10)
  •     except socket.err as e:
  •         print ("fail to listen on port %s"%e)
  •         sys.exit(1)
  •     #accept client connect
  •     while True:
  •         print ("waiting for client connection")
  •         c,addr=s.accept()
  •         #create a thread to handle tcp link
  •         t=threading.Thread(target=tcp_thread,args=(c,addr))
  •         t.start()

  • if __name__ == '__main__':
  •   start_tcp_server('localhost', 80)复制代码
    2. 客户端Client测试
    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. # www.etdev.net by respeke

    4. import socket

    5. #create socket
    6. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    7. #connect to server
    8. s.connect(('localhost', 80))

    9. #send request data
    10. h='GET / HTTP/1.1\r\n'
    11. h+='Host: localhost\r\n'
    12. h+='Accept: text/html\r\n'
    13. h+='Connection: keep-alive\r\n\r\n'

    14. s.send(h.encode('utf-8'))

    15. #receive data
    16. buffer = []
    17. while True:
    18.     #receiving up to 1k bytes at a time
    19.     d = s.recv(1024)
    20.     if d:
    21.         buffer.append(d)
    22.         print(buffer)
    23.         break
    24.     else:
    25.         break

    26. data = b''.join(buffer)

    27. # close connection
    28. s.close()

    29. header, html = data.split(b'\r\n\r\n', 1)
    30. print(header.decode('utf-8'))

    31. #writes the data to file
    32. with open('web.html', 'wb') as f:
    33.     f.write(html)
    复制代码

    3. 浏览器效果



    3. 源码下载

    py_http.rar (12.33 KB, 下载次数: 9)

    HTTP, WebServer
    收藏收藏

    相关帖子

    0

    主题

    1

    帖子

    24

    积分

    新手上路

    Rank: 1

    积分
    24
    沙发
    发表于 2018-11-20 21:35:40 | 只看该作者
    谢谢分享!

    93

    主题

    100

    帖子

    2337

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2337
    QQ
    板凳
     楼主| 发表于 2020-2-19 14:33:34 | 只看该作者
    简单而直接的python web 框架:web.py,官网:https://webpy.org/

    1. import web

    2. urls = (
    3.     '/(.*)', 'hello'
    4. )
    5. app = web.application(urls, globals())

    6. class hello:
    7.     def GET(self, name):
    8.         if not name:
    9.             name = 'World'
    10.         return 'Hello, ' + name + '!'

    11. if __name__ == "__main__":
    12.     app.run()
    复制代码

    上面就是一个基于web.py 的完整的web 应用。将上面的代码保存为文件code.py,在命令行下执行python code.py。然后打开你的浏览器,输入 http://localhost:8080 浏览器会显示“Hello, world”

    # 默认8080端口
    python code.py
    # 使用其他端口
    python code.py 8088




    返回列表 发新帖
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表