day24_python_1124
1 复习
2 TCP-UDP协议
3 tcp协议的socket
4 复杂tcp协议的socket
5 带退出的聊天程序
6 时间练习demo
7 粘包现象
1.复习
# 网络编程概念
# 两大开发架构
# C/S B/S
# ip地址
# mac地址
# 内网/外网
# 交换机 : 单播、广播、组播
# 在一个局域网内的通信
# 二层/数据链路层 - osi七层协议
# 数据链路层的协议 :arp协议(通过一台机器的ip地址找到mac地址)
# 数据链路层的网络设备 : 交换机、网卡
# 路由器 :
# 局域网与局域网之间的连接工具
# 三层/网络层 - osi七层协议
# 网络层的协议 :ip协议
# 网络层的设备 :路由器、三层交换机
# 网关
# 一个局域网要想访问局域网外部的其他机器,都要通过统一的网关接口
# 子网掩码
# 判断两台机器是否在同一个局域网内
# 端口来定位某一台机器上的某一个服务
# 如何定位你的网络中能够找到的唯一一台机器+服务 ip + 该服务的端口号
2.tcp-udp协议
# osi七层协议的传输层 : TCP/UDP协议
# 这两个协议标志着我们的数据传递的方式
# tcp协议 :语音通话
# 必须先接通电话,同一时刻只能和一个人聊天,传输比较稳定,慢
# 可以发送任意长度的消息
# udp协议 :发微信
# 不需要接通 只要互相知道ip 端口就可以通信 ,同时可以和多个人聊天,但是传输相对不稳定,传输速度快
# 不能传输过长的消息
# tcp :发送文件(邮件)、下载安装包、上传、下载电影、从网盘上上传、下载文件
# udp :即时通信类的、在线播放
# tcp协议
# 为什么它传输稳定、可靠?
# 先建立连接
# 三次握手、四次挥手
# tcp协议和udp协议各自的特点
3 tcp协议的socket
server
import socket #套接字
sk = socket.socket() #先买一部手机sk.bind(('127.0.0.1',9600)) #绑定一个电话卡 PS本地回环地址127.0.0.1sk.listen() #开机 py3.4后()里可以不加数字conn,addr = sk.accept() #阻塞,直到有客户端来连接,三次握手建立连接print(addr) # ('127.0.0.1', 52171)print(conn) # 包含addr的一些信息print(sk) # 不包含addr的conn信息conn.send(b'hello')msg = conn.recv(1024)print(msg)conn.close() #四次挥手,断开连接sk.close() #关机
client
import socket
sk = socket.socket()sk.connect(('127.0.0.1',9600))msg = sk.recv(1024)print(msg)sk.send(b'byebye')sk.close()
4 复杂tcp协议的socket
PS:连续相互对话
server
sk = socket.socket()sk.bind(('127.0.0.1',9600))sk.listen()conn,addr = sk.accept() #conn,addr只是可以换其他代替
while True: send_msg = input('msg : ') conn.send(send_msg.encode()) msg = conn.recv(1024).decode() print(msg)conn.close()sk.close()
client
import socket
sk = socket.socket()sk.connect(('127.0.0.1',9600))
while True: msg = sk.recv(1024).decode() print(msg) send_msg = input('msg : ') sk.send(send_msg.encode())
sk.close()
5 带退出的聊天程序
server
import socket
sk = socket.socket()sk.bind(('127.0.0.1',9600))sk.listen()
conn,addr = sk.accept()
while True: send_msg = input('msg : ') # q conn.send(send_msg.encode()) # send(q) if send_msg == 'q':break msg = conn.recv(1024).decode() if msg == 'q':break print(msg)
conn.close()
client
import socket
sk = socket.socket()sk.connect(('127.0.0.1',9600))
while True: msg = sk.recv(1024).decode() if msg == 'q':break print(msg) send_msg = input('msg : ') sk.send(send_msg.encode()) if send_msg == 'q':break
sk.close()
6 时间练习demo
server
import socketimport time
sk = socket.socket()sk.bind(('127.0.0.1',9600))sk.listen()
while True: conn,addr = sk.accept() fmt = conn.recv(1024) str_time = time.strftime(fmt.decode()) conn.send(str_time.encode()) conn.close()sk.close()
client
import socket
sk = socket.socket()sk.connect(('127.0.0.1',9600))sk.send(b'%Y/%m/%d %H:%M:%S')msg = sk.recv(1024).decode()print(msg)sk.close()
补充:
# str 字符串数据类型
# bytes 字节数据类型
# 中 :gbk bytes 100100110101
# 中 :utf8 bytes 100111100001
# send(bytes)
# bytes = recv()
# 我们要看 是看str
# 我们在发送数据之前是str,发送的是bytes
# 就需要对str进行编码,str.encode('utf-8')结果是一个bytes
# 我们在接受数据的时候 收到的也是bytes类型
# 我们要想看懂必须把bytes解码,bytes.decode('utf-8')结果就是一个字符串
7 粘包现象
server
import struct
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen()
conn,addr = sk.accept()
send_msg = input('>>>').encode()
bytes_len = struct.pack('i',len(send_msg))
conn.send(bytes_len)
conn.send(send_msg) # 粘包现象
conn.send(b'world')
conn.close()
sk.close()
# 1.发送端的粘包 合包机制 + 缓存区
# 2.接收端的粘包 延迟接受 + 缓存区
# 3.流式传输
# 电流 高低电压
# 所以我们说 tcp协议是无边界的流式传输
# 4.拆包机制
# 粘包现象
# 接收端不知道发送端给我发送了多长的数据
client
import struct
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
bytes_len = sk.recv(4)
msg_len = struct.unpack('i',bytes_len)[0]
msg = sk.recv(msg_len)
print(msg.decode())
msg2 = sk.recv(5)
print(msg2)
sk.close()
解决方法一
import struct
ret = struct.pack('i',560000)
print(ret,len(ret))
ret1 = struct.pack('i',123)
print(ret1,len(ret1))
ret2 = struct.pack('i',902730757)
print(ret2,len(ret2))
res = struct.unpack('i',ret)
print(res[0])
res = struct.unpack('i',ret1)
print(res[0])
res = struct.unpack('i',ret2)
print(res[0])
day24_python_1124的更多相关文章
随机推荐
- Python爬虫与一汽项目【三】爬取中国五矿集团采购平台
网站地址:http://ec.mcc.com.cn/b2b/web/two/indexinfoAction.do?actionType=showMoreCgxx&xxposition=cgxx ...
- zabbix监控服务搭建
命令配置 浏览器配置: 检查必须全部ok(若有warning,检查是否漏装包,重启php-fpm服务) 数据库信息 主机名(zabbix server ip).端口号(默认).名字(随意) 配置摘要 ...
- es6 class中责任链模式与AOP结合
责任链模式大家应该都清楚,比如JS中的冒泡,Java中的拦截器.过滤器,都运用到了责任链模式. 可以看我之前的文章介绍责任链的:https://www.cnblogs.com/wuguanglin/p ...
- xftp5和xshell的使用
目的:实现windows和linux系统之间文件的传输 步骤:1)下载xshell5 百度搜索即可,直接下载安装 2)xshell5下载完成后与虚拟机链接成功 3)下载xftp5点击 然后跟据官方的指 ...
- XSS漏洞学习笔记
XSS漏洞学习 简介 xss漏洞,英文名为cross site scripting. xss最大的特点就是能注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的. 说白了就是想尽办法让你加载 ...
- [ZOJ 4024] Peak
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4024 从前往后找满足al<al+1的最大下标l,从后往前找 ...
- 人生苦短,我用Python——博客目录
计算机基础 计算机硬件基础知识 操作系统基础 Python基础 Windows环境下Python2和Python3的安装 交互式环境与变量的使用 简单介绍Python基本数据类型及程序交互 基本运算符 ...
- 使用SpringMVC框架实现文件上传和下载功能
使用SpringMVC框架实现文件上传和下载功能 (一)单个文件上传 ①配置文件上传解释器 <!—配置文件上传解释器 --> <mvc:annotation-driven>&l ...
- 移动质量(MQ)测试系列
移动质量(MQ)测试 向移动开发者提供专业.稳定.全面.高价值的自动化测试平台. 发现 APP 中的各类隐患,包括 APP 崩溃.各类兼容性.功能性.性能问题等等. MQ 的 5 大功能(兼容性测试. ...
- 四、Python数据类型(二)
一.布尔(Boolean) 布尔类型的数据只有两个:(真)True和(假)False.多用于条件语句或者是作为函数返回值. 二.字典(dictionary) 1.认识字典 将数据组织成键值对(key- ...