socket 编程
套接字 位于应用层和传输层之间你的一个虚拟层,一个接口
步骤演示
- socket服务端 (百度服务器)
- 绑定IP和端口
- 监听
- 等待连接
- 接受连接
- 接收数据
- 返回数据
- 断开连接
- socket客户端(浏览器)
- 连接上百度的socket服务器
- 发送数据
- 接收数据
- 断开连接(服务端和客户端谁先断开都可以)
简单示例
- 页面返回ok
import socket
#创建socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen()
#等待连接
while True:
conn,addr=sk.accept() ##建立连接
#接受数据
conn.recv(2048)
#返回数据
conn.send(b'ok')
#断开连接
conn.close()
- 是返回数据有问题,导致响应无效
- http协议相关(了解一下)
- 将上面代码改变一下
- 在网页上访问之后,控制台内打印出了信息
b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8000\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n'
- 改变代码(按照HTTP响应格式),之后即可成功访问数据
#返回数据
conn.send(b'HTTP/1.1 200 OK\r\n\r\nok')
- 若数据中含有中文,则要设置字符集
conn.send(b'HTTP/1.1 200 OK\r\ncontent-type: text/html; charset=utf-8\r\n\r\n')
- 通过不同路径返回不同内容(包括返回html页面以及动态页面)
import socket
import time
#创建socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind(('127.0.0.1',8000))
#监听
sk.listen()
def rihan(url):
return '欢迎来到 {}'.format(url)
def oumei(url):
return 'welcome to {}'.format(url)
def home(url):
with open('home.h