day37 Pyhton 网络编程04
# tcp协议和udp协议的选择问题
# tcp
# 大量的连续的数据 传递文件\发送邮件
# 文件的传递
# 下载电影
# udp
# 短消息类 社交软件
# qq 微信
# 在线播放视频 快会丢帧 # 黏包
# 黏包现象
# 连续send,对应连续的recv
# 在tcp连接中 消息之间无边界
# 黏包现象的解决
# send(b'hello') 5 1个字节
# send(b'world') # send(b'hello'*10) 50 2个字节
# send(b'world') # send(b'hello'*100) 500 3个字节
# send(b'world')
# 数据类型 : int str bytes
# 编码 : ascii utf-8 gbk
# 01
# 二进制 --> 十进制
# 计算机习惯用 人用
# 如果像字典一样给每一个文字字母和数字都添加一个编号,就可以用数字表示其他元素了
# 数字 字母 常用的符号 阿拉伯文 第一批我们说的ascii 0-255
# print(bin(65))
# print(bin(250)) # 11111010
# print(chr(250)) # chr接受一个ascii码,返回一个对应的字符
# Aú 01000001 11111010
# 字节 8位是一个字节
# 1字节 = 8位2进制数
# byte bit
# bytes
# ascii
# 各自国家的标准码(没有统一)
# unicode 万国码 浪费空间
# utf-8 节省空间的 万国码
# 文件存储在硬盘上 : 010101010
# 二进制 -8位一读-> 字节
# bytes --> str字符串 # 你要确认bytes类型到底是什么编码的
# bytes.decode('utf-8')
# str --> bytes
# str.encode('utf-8') # utf-8编码之后的字节 '中'
# str.encode('其他编码') # utf-8编码之后的字节 'yo'
# 1.所有编码与编码之间的关系 : ascii码 各自国家的编码(gbk gb2312) unicode(万国码) utf-8(存储了所有国家中的文字)
# 2.你读出来的字符 --> 字节
# 字符串数据类型中的一个元素 就是一个字符 如果是中文字符串,每一个"字"都是一个字符
# 如果是英文字符串,每一个"字母"都是一个字符
# 每一个字符都可以转换成对应的 字节 bytes
# bytes是最接近二进制的内容
# 3.能在文件中存储的\在网络上传输的都是二进制
# 但是计算机中我们传递数据不需要程序员自己去把要传递的内容转成二进制了
# 你只需要把内容转换成bytes(字节)就可以了
# 4.所以如果是utf-8编码的化 对于数字\字母\符号你的转换永远遵循ascii,且只占1个字节
# 5.并且在网络上传输的由于都是字节,所以我们所计算的传输长度,也是字节的长度而不是字符的长度
# recv(1024) 1024代表字节
# 'hello,中国' # 8个字符 = 6个字节 + 3个字节*2 = 6+6 = 12个字节
# 所以我们send的时候send的是字节串,我们接收的时候也接受的是字节串
# 6.你不能在网络上传递int类型,只能传bytes
# int --> str --> bytes
# 5 '5' b'5'
# os模块
# 1.os.path.join('绝对路径','文件名')
# 2.os.path.split(E:\s17\day33\1.内容回顾.py) 分割 :(E:\s17\day33,1.内容回顾.py)
# 3.os.path.dirname('E:\s17\day33') 获取路径的上一级目录'E:\s17'
# 4.os.path.basename('E:\s17\day33') 获取路径的最后一层名字day33
# 5.os.rename
# 6.os.remove
# 7.os.makedirs('E:\s17\day33\new\new2') 创建一个新目录
# os.mkdir('新的路径')
# 8.os.path.isfile('E:\s17\day33\1.内容回顾.py') 判断E:\s17\day33\1.内容回顾.py是不是文件
# 9.os.path.getsize('E:\s17\day33\1.内容回顾.py') 获取1.内容回顾.py文件的字节大小
# 10.os.listdir('E:\s17\day33') 显示'E:\s17\day33'路径下的所有文件和文件夹
# struct模块是干什么的???
# import struct # 只做一件事儿 能够将数字转换成固定4字节的bytes
# ret3 = struct.pack('i',500) # 帮助你 数字 -(固定4个字节)-> bytes
# print(ret3,len(ret3))
# ret2 = struct.pack('i',50) # 帮助你 数字 -(固定4个字节)-> bytes
# print(ret2,len(ret2))
# ret = struct.pack('i',5) # 帮助你 数字 -(固定4个字节)-> bytes
# print(ret,len(ret))
# res = struct.unpack('i',ret)
# print(res)
# res2 = struct.unpack('i',ret2)
# print(res2)
# res3 = struct.unpack('i',ret3)
# print(res3)
# 编码
# os模块
# 网络基础的逻辑
# tcp/udp协议
# 黏包
# socketserver
# 校验客户端是否合法
# 文件的上传
# 本周大作业
# ftp需求
校验客户端是否合法
import os
import socket
import hmac def check_conn(conn):
secret_key = b'alex_sb'
rand_code = os.urandom(32)
conn.send(rand_code)
obj = hmac.new(secret_key,rand_code)
byte_ret = obj.digest()
byte_msg = conn.recv(1024)
if byte_ret == byte_msg:
return True
else:
return False sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.listen() conn,addr = sk.accept()
if check_conn(conn):
'''写你本身要写的代码'''
conn.send('你是合法的连接'.encode())
msg = conn.recv(1024)
print(msg.decode())
conn.close() # 只有程序认可的用户才能使用我的server端
# 1.登陆
# 2.随意的一个server
# 只要是我写的client端都可以使用我的server
# 公司通用业务
# 在建立和client端的连接之后
# 有一种检测这个客户端是否合法的机制
# 如果合法 再继续通讯
# 如果不合法 直接关闭
import socket
import hmac
def check_conn(sk):
secret_key = b'alex_sb'
rand_code = sk.recv(32)
obj = hmac.new(secret_key,rand_code)
byte_ret = obj.digest()
sk.send(byte_ret) sk = socket.socket() sk.connect(('127.0.0.1',9000))
check_conn(sk)
# 以下部分你可以自由发挥
print(sk.recv(1024).decode())
sk.send('那么愉快的开始沟通吧'.encode('utf-8'))
sk.close()
socketserver
import struct
import socketserver class Myserver(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request
msg = '你好'.encode('utf-8')*100
int_num = len(msg)
byte_num = struct.pack('i',int_num)
conn.send(byte_num) # 4bytes
conn.send(msg)
conn.send(b'world') server = socketserver.ThreadingTCPServer(('127.0.0.1',9000),Myserver)
server.serve_forever()
import time,struct
import socket
sk = socket.socket() sk.connect(('127.0.0.1',9000))
time.sleep(0.5) num = struct.unpack('i',sk.recv(4))
print(sk.recv(num[0]).decode('utf-8'))
print(sk.recv(1024))
day37 Pyhton 网络编程04的更多相关文章
- Python网络编程04 /recv工作原理、展示收发问题、粘包现象
Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...
- day34 Pyhton 网络编程
一今日内容 # 函数 # 面向对象 # 进阶 # 网络编程 4 # 并发编程 6-7 # 概念 # 网络基础 # 局域网的概念 # 交换机和路由器的工作流程 # ip地址 # mac地址 # 子网掩码 ...
- day41 Pyhton 并发编程04
内容回顾 socket 最底层的网络通信 所有的网络通信都是基于socket 进程 什么是进程? 是操作系统的发展过程中,为了提高cpu的利用率,在操作系统同时运行多个程序的时候,为了数据的安 ...
- day36 Pyhton 网络编程03
一.内容回顾 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- day35 Pyhton 网络编程02
一内容回顾 网络基础 网络应用开发架构 B/S架构 浏览器直接作为客户端的程序 C/S架构 B/S是特殊的C/S osi七层模型 应用层 python代码 http https ftp ...
- Linux网络编程学习路线
转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程 1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...
- [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)
一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...
- Python中级 —— 04网络编程
网络编程 网络编程对所有开发语言都是一样的,Python也不例外.用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信. TCP编程 TCP建立可靠连 ...
- 【TCP/IP网络编程】:04基于TCP的服务器端/客户端
摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...
随机推荐
- 【NOIP2015模拟】终章-剑之魂
背景介绍 古堡,暗鸦,斜阳,和深渊-- 等了三年,我独自一人,终于来到了这里-- "终焉的试炼吗?就在这里吗?"我自言自语道. "终焉的试炼啊!就在这里啊!"我 ...
- iptables防火墙说明即使用
防火墙是架设在公网和私网之间的服务器,隔离公网和私网,保护私网. RHEL7默认使用firewalld作为防火墙. 但firewalld底层还是调用包过滤防火墙iptables #systemctl ...
- Superset 0.37 发布——颜值最高的数据可视化平台
Superset 0.37,增加可视化插件,行级权限控制 使用Superset已经有一段时间,其良好的体验与丰富的图表功能节省了大量的时间.但是对于权限,自定义图表,图表下载,报警邮件一直没有很好的支 ...
- [LeetCode]152. 乘积最大子序列(DP)
题目 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示 ...
- [LeetCode]33. 搜索旋转排序数组(二分)
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存在这个目 ...
- Linux内存子系统——Locking Pages(内存锁定)
该部分内容可以参考libc man page 3.5 LockingPages 概述 你可以让系统将特定的虚拟内存页与实际页帧相"关联",并保持这样的状态(称为锁定).该部分内存不 ...
- JVM运行时数据区--程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息.CPU只有把数据装载到寄存器才能够运行.JVM中 ...
- openstack (共享服务) 消息队列rabbitmq服务
云计算openstack共享组件——消息队列rabbitmq(3) 一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队 ...
- 现代C++教程:高速上手(四)-容器
1.线性容器 std::array与std::vector不同的是,array对象的大小是固定的,如果容器大小是固定的,那么可以优先考虑使用std::array容器. 由于std::vector是自动 ...
- Oracle学习(十四)分表分区
一.前言 大数据量的查询,不仅查询速度非常慢,而且还会导致数据库经常宕机,在尝试添加索引及查询方式修改后,还有没有更有效的解决方案呢? 分库.分表.分区这些概念咱就应该了解一下. 二.分表 假如一个大 ...