查看: 969|回复: 1
打印 上一主题 下一主题

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

[复制链接]

45

主题

47

帖子

616

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
616
跳转到指定楼层
楼主
发表于 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, 下载次数: 8)

    HTTP, WebServer
    本主题由 respeke 于 2018-11-22 09:30 加入精华
    收藏收藏

    0

    主题

    1

    帖子

    18

    积分

    新手上路

    Rank: 1

    积分
    18
    沙发
    发表于 2018-11-20 21:35:40 | 只看该作者
    谢谢分享!
    返回列表 发新帖
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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