互联网基础
作者:互联网
数据的交互
- SCOKET套接字
- 通信循环
- 链接循环
- 代码优化
- 黏包问题
- 大文件上传
SOCKET套接字
简介:
由于操作OSI七层是所有C/S框架程序都要经历的过程 在代码量庞大的情况下 python可以调用模块来简化代码 所以需要用一个模块来简化
SCOKET套接字模块一门技术 在需要处理每一层代码的情况下 调用SCOKET模块不需要自己处理每一层 属于最底层模块
SCOKET模块
C/S架构的软件无论是在编写还是在运行 都应该先考虑服务端
服务端
import scoket
file = scoket.socket() # 打开模块窗口
file.bind(('IP',端口号))
'''
服务端应该具备相应的特征 固定的网址链接 类似淘宝网址
'''
file.listen(5) # 进入链接端口进行操作
客户端进行呼叫 给予链接
scok,addr = file.accept() #等待服务端接收信号
data = sock.recv(字节数) # 接收客户端传来的信息
'''
recv 和 send接收的信息都是bytes 需要解码操作
'''
scok.close() # 关闭对话链接
file.close() # 关闭程序链接
# 客户端
import socket
client = scoket.scoket() # 产生一个scoket对象
client.connect(('IP',端口号)) # 端口号和IP以服务端的地址链接为主
client.send(b'welcome world') # 发送给服务端信息
data = clinet.recv(1024) # 这个字节数以收到的信息为主接收到服务端的信息并且解码
clinet.close() # 结束对话窗口
通信循环
1. 先解决消息固定的问题
2. 在解决通信循环的问题
while True:
data = sock.recv(1024) # 听别人说话
print(data.decode('utf8'))
msg = input('请回复消息>>>:').strip()
sock.send(msg.encode('utf8')) # 回复别人说的话
while True:
msg = input('请输入你需要发送的消息>>>:').strip()
client.send(msg.encode('utf8')) # 给服务端发送消息
data = client.recv(1024) # 接收服务端回复的消息
print(data.decode('utf8'))
代码优化及链接循环
1. 发送消息不能为空
统计判断长度即可
2. 反复重启服务端可能会报错:address in use
from socket import SOL_SOCKET,SO_REUSEADDR
server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind前加解决相关问题
3. 链接循环
'''
如果是windows 客户端异常 可以使用异常模块解决
如果是mac或者linus服务端会收到一个空信息 对于这种信息处理需要通过 if len()进行判断字节是否为零
'''
客户端如果异常断开 类似网络链接断开的现象 服务端代码应该重新回到等待窗口链接的状态 如果是windows系统下端口断开后添加异常处理则会服务端会处于单方面呼叫状态无法链接到客户端端口 当然这是单端口的情况下 多端口的处理则需要并发处理
半连接池
listen(5)
py文件默认是单次运行的 多次运行需要设置字节数端口
或者半连电池
设置的最大等待人数 >>>:节省资源 提高效率
黏包问题
客户端
import socket
cilent = socket.socket()
cilent.connect(('127.0.0.1',8080))
cilent.send(b'hello')
cilent.send(b'byebye')
cilent.send(b'again,bye')
服务端
import socket
server = socket.socket()
server.bind(('127.0.0.1',8080))
server.listen(5)
conn,addr = server.accept()
data = conn.recv(1024)
print(data)
data1 = conn.recv(1024)
print(data1)
data2 = conn.recv(1024)
print(data2)
b'hellobyebyeagain,bye'
b''
b''
得出结果
# TCP协议的特点
会将数据量比较小并且时间间隔比较短的数据整合到一起发送
并且还会受制于recv括号内的数字大小(核心问题!!!)
流式协议:跟水流一样不间断
思路:
困扰我们的核心问题是不知道即将要接收的数据多大
如果能够精准的知道数据量多大 那么黏包问题就自动解决了
设置字节上限来解决问题
解决黏包问题
方向:精准的获取数据大小 便于设置字节上限
struct模块
import struct
data = 'hello' 注意 这是5字节的字符串
print(len(data)) # 5
res1 = struct.struct('i',len(data1)) # 第一个参数是格式 写i就可以了
print(len(res1)) # 4
ret1 = struct.unpack('i',res1) # 进行操作解析 结果是一个集合
print(ret1) # (5,) 元组里面的5就是被隐藏的字节数
'''
pcak可以将任意长度的数字打包成固定的长度
unpack可以江固定长度的数字解包成打包成数据前的真实长度
'''
思路:
1.先将真实数据打包成固定长度的包
2.将固定长度的包先发给对方
3.对方接收到包之后再解包获取真实数据长度
4.接收真实数据长度
"""
标签:socket,data,基础,互联网,print,recv,链接,服务端 来源: https://www.cnblogs.com/051nogato/p/16151501.html