python30day
内容回顾
tcp协议的多人多次通信
- 和一个人通信多说句话
- 和一个人聊完再和其他人聊
- bind 绑定一个id和端口
- socket()tcp协议的server
- listen 监听,代表socket服务的开启
- accept 和客户端建立连接的过程
- send 直接通过连接发送消息,不需要地址
- recv 只接收消息
- connect 客户端、tcp协议的方法,和server端建立连接
- close 关闭服务、连接
udp协议的多人通信
- socket(type=socket.SOCK_DGRAM)
- sendto 需要写一个对方的地址
- recvfrom 接收消息和地址
- close 关闭服务、连接
每句话什么意思?执行到哪程序等待、阻塞、结束阻塞?
- input() 等待
- accept 阻塞,有客户端来和我建立连接就结束阻塞
- recv 阻塞,直到收到对方发来的消息结束阻塞
- recvfrom 阻塞
- connect 阻塞,直到server端结束了对一个client的服务,开始和当前client建立连接的时候结束阻塞
粘包现象
- 什么是粘包
- 两条或更多条分开发送的信息连在一起
- 发生在发送端:发送间隔短,数据小,由于优化机制就合并在一起发送了
- 发送在接收端:接收不及时,所以数据就在接收方的缓存端黏在一起了
- 粘包发生的本质:tcp协议的传输是流式传输,数据与数据之间没有边界
- 怎么解决粘包:自定义协议 struct模块
- 发送端
- 先发送四字节的数据长度
- 再按照长度发送数据
- 接收端
- 先接受四字节 知道数据长度
- 再按照长度接收数据
- 发送端
- 什么是粘包
tcp文件传输
import socket
import json
#接收
sk=socket.socket() #创建套接字
sk.bind(('127.0.0.1',9000)) #绑定端口
sk.listen() conn,_=sk.accept()
msg=conn.recv(1024).decode('utf-8')
print(msg)
msg=json.loads(msg) with open(msg['filename'],'wb')as f:
content=conn.recv(msg['filesize'])
print('---->',len(content))
f.write(content) conn.close()
sk.close()
import socket
import os
import json
# 发送
sk=socket.socket() #创建套接字
sk.connect(('127.0.0.1',9000)) # 文件名、文件大小
abs_path=r'E:\Py Project\day30\tmp'
filename=os.path.basename(abs_path)
filesize=os.path.getsize(abs_path)
dic={'filename':filename,'filesize':filesize}
str_dic=json.dumps(dic)
sk.send(str_dic.encode('utf-8')) with open(abs_path,mode='rb') as f:
content=f.read()
sk.send(content) sk.close()
今日内容
tcp协议的自定义协议解决粘包问题
验证客户端合法性
并发的tcp协议server端---socketserver
代码总行数3030+41=3047行
python30day的更多相关文章
随机推荐
- 【LeetCode】Largest Number 解题报告
[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...
- 【LeetCode】575. Distribute Candies 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...
- Codeforces 1073C:Vasya and Robot(二分)
C. Vasya and Robot time limit per test: 1 secondmemory limit per test: 256 megabytesinput: standard ...
- 基于 Electron 的 Rubick 2.4k star 啦,同步更新新功能!
为什么要做 Rubick 其实做 Rubick 1.x 的初衷就是解决自己的问题的:特别需要一款支持自定义插件的桌面端应用来简化使用者安装庞大桌面端应用的臃肿.而且涉及到数据安全的问题,插件只能在公司 ...
- Null和空值对于avg计算时产生的影响以及处理
为什么要关注这一块呢:1.面试中可能会有涉及 2.工作中真的也可能会用,既然有可能我也用过,就拿出来跟大家分享一下,上一篇的博文,数据已准备好就不做数据准备的介绍了. step1:select * f ...
- 自动化集成:Pipeline整合Docker容器
前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述流水线集成Docker用法. 一.背景描述 微服务架构 ...
- Oracle中的基本数据类型
一.Oracle 基本数据类型 1.字符数据类型 CHAR:存储固定长度的字符串,如果没有指定长度,默认为1个字节,如果数据长度没有达到指定的长度,则通过填充空格的方式来使其达到定义的长度(CHAR类 ...
- CGO快速入门
1. 通过`improt "C"`语句开启CGO特性2. `/**/`中间是C代码,之后接 import "C" 如果存在空行 就会报错.could not d ...
- 初识python:scoket 单用户互发消息
实现功能: 启动"服务器".通过"客户端1"连接"服务器",然后互发消息.在此过程中,有"客户端2"连接到"服 ...
- Selenium_使用switch_to.alert处理弹窗(14)
与switch_to.window 和 switch_to.frame 相比,switch_to.alert的alert方法使用了@property 装饰器,所以在使用时alert被当成属性调用. 演 ...