# 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的更多相关文章

  1. Python网络编程04 /recv工作原理、展示收发问题、粘包现象

    Python网络编程04 /recv工作原理.展示收发问题.粘包现象 目录 Python网络编程04 /recv工作原理.展示收发问题.粘包现象 1. recv工作原理 2. 展示收发问题示例 发多次 ...

  2. day34 Pyhton 网络编程

    一今日内容 # 函数 # 面向对象 # 进阶 # 网络编程 4 # 并发编程 6-7 # 概念 # 网络基础 # 局域网的概念 # 交换机和路由器的工作流程 # ip地址 # mac地址 # 子网掩码 ...

  3. day41 Pyhton 并发编程04

    内容回顾 socket 最底层的网络通信 所有的网络通信都是基于socket     进程 什么是进程? 是操作系统的发展过程中,为了提高cpu的利用率,在操作系统同时运行多个程序的时候,为了数据的安 ...

  4. day36 Pyhton 网络编程03

    一.内容回顾 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...

  5. day35 Pyhton 网络编程02

    一内容回顾 网络基础 网络应用开发架构 B/S架构   浏览器直接作为客户端的程序 C/S架构 B/S是特殊的C/S osi七层模型 应用层  python代码   http  https  ftp  ...

  6. Linux网络编程学习路线

    转载自:https://blog.csdn.net/lianghe_work/article 一.网络应用层编程   1.Linux网络编程01——网络协议入门 2.Linux网络编程02——无连接和 ...

  7. [19/04/13-星期六] 网络编程_基本概念(关注传输层、数据传输,TCP和UDP)

    一.概念 ▪ 什么是计算机网络? 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统, 网络管理软件及网络通信协议的管理和协调下,实现资源共享和信 ...

  8. Python中级 —— 04网络编程

    网络编程 网络编程对所有开发语言都是一样的,Python也不例外.用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信. TCP编程 TCP建立可靠连 ...

  9. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

随机推荐

  1. ELK入门及基本使用

    预备知识-Restful 起源 在没有前后端分离概念之前,一个网站的完成总是“all in one”,在这个阶段,页面.数据.渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员 ...

  2. [03] C# Alloc Free编程

    C# Alloc Free编程 首先Alloc Free这个词是我自创的, 来源于Lock Free. Lock Free是说通过原子操作来避免锁的使用, 从而来提高并行程序的性能; 与Lock Fr ...

  3. 2018.12.30【NOIP提高组】模拟赛C组总结

    2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...

  4. linux下禁止root和匿名用户登录ftp

    1.ftp通过root或其他用户进入可视化界面权限过大,容易导致系统文件误删 windows下输入ftp://IP去访问,不需要账号密码就可以访问到ftp文件夹 刚进去pub是空的,在linux上新增 ...

  5. [补题]求a[i]+a[j]+i-j的最大值,要求i<j

    题目 如题. 例: 输入: 5 11 6 5 18 12 输出: 29 题解 思路: 一直是按着(a[i]+a[j])+(i-j)想后序的思路,不应该限制住自己,应该多考虑拆的方法.正确思路是把a[i ...

  6. JAVA | Java 解决跨域问题

    JAVA | Java 解决跨域问题 Table of Contents 引言 什么是跨域(CORS) 什么情况会跨域 解决方案 前端解决方案 后端解决方案 具体方式 一.使用Filter方式进行设置 ...

  7. 5.Strom-事务型拓扑

  8. Shell学习(二)Shell变量

    一.Shell变量 变量的定义 例子: my_job="Learn Shell" PS:变量名和等号之间不能有空格!!! 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头 ...

  9. Spring Boot学习(一)初识Spring Boot

    Spring Boot 概述 Spring Boot 是所有基于 Spring 开发的项目的起点.Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置 ...

  10. 正则表达式(代码java版)

    目录 元字符 检测工具 普通字符 字符类 预定义字符类 数量词 默认数量词 自定义量词 预定义量词 边界标识符 正则组 简单应用 复杂组序 捕获组 看了好些天的正则表达式,终于有时间来写一篇关于它的博 ...