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

1. 服务端Server

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# www.etdev.net by respeke

import socket

import threading

def tcp_thread(sock,addr):

print('accept new connection from %s,%s'%addr)

rh='HTTP/1.1 200 OK\r\n'

# rh+='Date: Thu, 08 Nov 2018 01:32:36 GMT\r\n'

rh+='Content-Type: text/html\r\n'

rh+='Connection: Keep-Alive\r\n'

rb='<!DOCTYPE html>\r\n'

rb+='<head>\r\n'

rb+='<meta charset="utf-8">\r\n'

rb+='<title>Python WebServer</title>\r\n'

rb+='</head>\r\n'

rb+='<body style="background-color: #97a8b9">\r\n'

rb+='<div style="margin:100px auto; width:500px;padding: 20px 60px; background-color: #D3D3D3; border: 5px solid maroon;">\r\n'

rb+='<h1 style="font-style:italic">Welcome to <a href="http://www.etdev.net">www.etdev.net</a></h1>\r\n'

rb+='<p>电子技术开发网 - ETDev,电子技术、嵌入式技术交流分享园地</p>'

rb+='</div>\r\n'

rb+='</body>\r\n'

rb+='</html>'

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测试

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# www.etdev.net by respeke

import socket

#create socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#connect to server

s.connect(('localhost', 80))

#send request data

h='GET / HTTP/1.1\r\n'

h+='Host: localhost\r\n'

h+='Accept: text/html\r\n'

h+='Connection: keep-alive\r\n\r\n'

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

#receive data

buffer = []

while True:

#receiving up to 1k bytes at a time

d = s.recv(1024)

if d:

buffer.append(d)

print(buffer)

break

else:

break

data = b''.join(buffer)

# close connection

s.close()

header, html = data.split(b'\r\n\r\n', 1)

print(header.decode('utf-8'))

#writes the data to file

with open('web.html', 'wb') as f:

f.write(html)

3. 浏览器效果

4. 源码打包下载

https://www.etdev.net/thread-61-1-1.html

猜你喜欢

转载自blog.csdn.net/kezunhb/article/details/84310189