python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业
一、昨日内容回顾
1.arp协议含义
2.子网,子网掩码
3.两台电脑在网络中怎么通信的?
4.tcp和udp socket编码
5.tcp和udp协议的区别
6.tcp三次握手和四次挥手,syn洪攻击,大量time-wait状态等
二、今日内容
1、认识下socket中的一些常见方法
服务器套接字函数
s.bind()
s.listen(n) # 至少可以同时连接2个,至多n个
s.accept()
客户端套接字函数
s.connect()
s.connect_ex()
公共用途的套接字函数
s.send()
s.recv()
s.sendall()
s.sendto()
s.recvfrom()
s.getpeername()
s.gethostname()
s.setsockopt()
s.getsockopt()
s.close()
面向锁的套接字方法
s.setblocking()
s.settimeout()
s.gettimeout()
面向文件的套接字函数
s.fileno()
s.makefile()
send()和sendall()区别:
2、对网络编程中的安全做一个了解
1.客户端合法性验证,基于socket实现(面向函数编程)
- import os
- import hashlib
- from socket import *
- import struct
- sk = socket(AF_INET, SOCK_STREAM)
- sk.bind(('127.0.0.1', 8080))
- sk.listen(5)
- conn,addr = sk.accept()
- def md5_check(conn_tmp):
- salt = b'love'
- bytes_str = os.urandom(32)
- conn_tmp.send(bytes_str)
- my_obj = hashlib.md5(salt)
- my_obj.update(bytes_str)
- return my_obj.hexdigest().encode('utf-8')
- def communication(conn_tmp):
- while 1:
- msg_s = input('>>>').encode('utf-8')
- msg_s_len = len(msg_s)
- head = struct.pack('i', msg_s_len)
- conn_tmp.send(head+msg_s)
- head = conn_tmp.recv(4)
- msg_r_len = struct.unpack('i',head)[0]
- msg_r = conn_tmp.recv(msg_r_len).decode('utf-8')
- print(msg_r)
- server_md5 = md5_check(conn)
- if conn.recv(32) == server_md5:
- print('客户端合法性验证成功!')
- communication(conn)
- else:
- print('验证失败!')
客户端合法性验证——服务器端
- import hashlib
- from socket import *
- import struct
- sk = socket(AF_INET, SOCK_STREAM)
- sk.connect_ex(('127.0.0.1', 8080))
- def md5_check(conn_tmp):
- salt = b'love'
- bytes_str = conn_tmp.recv(32)
- my_obj = hashlib.md5(salt)
- my_obj.update(bytes_str)
- return my_obj.hexdigest().encode('utf-8')
- def communication(conn_tmp):
- while 1:
- head = conn_tmp.recv(4)
- msg_r_len = struct.unpack('i',head)[0]
- msg_r = conn_tmp.recv(msg_r_len).decode('utf-8')
- print(msg_r)
- msg_s = input('>>>').encode('utf-8')
- msg_s_len = len(msg_s)
- head = struct.pack('i', msg_s_len)
- conn_tmp.send(head+msg_s)
- sk.send(md5_check(sk))
- communication(sk)
客户端合法性验证--客户端
2.客户端合法性验证,基于socketserver实现
- import socket
- import struct
- import json
- sk = socket.socket()
- sk.connect_ex(('127.0.0.1', 8080))
- username = input('username>>>').strip()
- password = input('password>>>').strip()
- dic = {'username': username, 'password': password}
- bytes_dic_json = json.dumps(dic).encode('utf-8')
- dic_json_len = len(bytes_dic_json)
- bytes_head = struct.pack('i', dic_json_len)
- sk.send(bytes_head+bytes_dic_json)
- print(sk.recv(1024).decode('utf-8'))
- sk.close()
基于socketserver模块的客户端合法性验证--客户端
- import socketserver
- import struct
- import hashlib
- import json
- class MyServer(socketserver.BaseRequestHandler):
- def handle(self):
- head = self.request.recv(4)
- dic_json_len = struct.unpack('i', head)[0]
- dic_json = self.request.recv(dic_json_len)
- dic = json.loads(dic_json.decode('utf-8'))
- md5_obj = hashlib.md5(dic['username'].encode('utf-8'))
- md5_obj.update(dic['password'].encode('utf-8'))
- password = md5_obj.hexdigest()
- with open('userinfo',encoding='utf-8') as f:
- for line in f:
- name, passwd = line.strip().split(":")
- if name.strip() == dic['username'] and passwd.strip() == password:
- print('连接成功!')
- self.request.send('恭喜您认证登录成功!'.encode('utf-8'))
- break
- else:
- print('连接失败!')
- sk = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer)
- sk.serve_forever()
基于socketserver模块的客户端合法性验证--服务器端
3、socketserver模块(这个模块封装的是并发中的技术)
4、小常识,浏览器中如何在一段时间内记录了你的登录验证?
5、ftp作业
实现中。。。
三、扩展
1.math模块,decimal模块简要了解
内置函数round(2.345,2) # 四舍五入取选定小数位
math.floor() # 向下取整
math.ceil() # 向上取整
decimal.getcontext(),获取设置
#Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
# 默认prec28位精度,rounding=ROUND_HALF_EVEN,左侧为奇数ROUND_UP,偶数(even)ROUND_DOWN
decimal.Decimal(1)/decimal.Decimal(3)
2.print函数输出字符左右对齐问题。
- print('ss'.center(20,'*'))
- print('%06.2f' % 1.2222)
- print('%6.2f' % 1.2222) # 右对齐,总计小数点和小数点左右数字加一起5个字符英文,不足左边补空
- print('%5d' % 6) # 右对齐,总计5个字符英文,不足左边补空
- print('%05d' % 6) # 右对齐,总计5个字符英文,不足左边补零
- print('%10s' % 'GG') # 右对齐,总计10个字符英文
- print('%-10s' % 'G') # 左对齐,总计10个字符英文
- print('%10s' % '中国')
- """
- *********ss*********
- 001.22
- 1.22
- 6
- 00006
- GG
- G
- 中国
- """
python全栈开发day29-网络编程之socket常见方法,socketserver模块,ftp作业的更多相关文章
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- 【python之路35】网络编程之socket相关
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- python 全栈开发,Day92(编程式的导航,vue页面布局,marked包的使用)
昨日内容回顾 1. 组件间的传值 1. bus --> 空Vue对象 通过向bus对象抛出自定义事件的方式在组件间传递信息 2. 注意事项: 1. bus.$on()应该在组件mounted(挂 ...
- Python全栈开发-Day8-Socket网络编程
本节内容 断言 Socket构建框架 ftp构建框架 Socket粘包 Socket介绍 Socket参数介绍 基本Socket实例 通过Socket实现简单SSH SocketServer 支持多用 ...
- python 全栈开发,Day26(hashlib文件一致性,configparser,logging,collections模块,deque,OrderedDict)
一.hashlib文件一致性校验 为何要进行文件一致性校验? 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进 ...
- python全栈开发- day14列表推导式、生成器表达式、模块基础
一.列表推导式 #1.示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i fo ...
- python 全栈开发之路 day1
python 全栈开发之路 day1 本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- python全栈开发-Day7 字符编码总结
python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...
随机推荐
- 01-VS充当IIS的配置步骤
一. 背景 在实际开发中,经常会遇到需要在线调试,比如:第三方支付的回调.App接口借助PostMan工具测试,需要在代码上直接加断点,来进行调试,VS默认是不支持这种方式,需要手动配置一下,才能达到 ...
- 自动升级CentOS Python至官方最新版
#!/bin/bash # .检查当前系统Python版本 python_old_version=$(python -V >& | awk '{print $2}') echo &quo ...
- 选择排序算法的JAVA实现
1,采用选择排序对元素进行排列时,元素之间需要进行比较,因此需要实现Comparable<T>接口.即,<T extends Comparable<T>>. 更进一 ...
- JavaScript实战总结
javascript中数组的22种方法:http://www.cnblogs.com/xiaohuochai/p/5682621.html 1.js闭包 2.eval函数 eval(“字符串”) 将 ...
- TestNg失败重试机制
TestNg提供了失败重试接口IRetryAnalyzer,需要实现retry方法: package com.shunhe.testngprac.retry; import org.testng.IR ...
- C# 简单线程实例
1.简单线程实例 以及委托(同步委托.异步委托) using System; using System.Collections.Generic; using System.Linq; using Sy ...
- js给<img>的src赋值
用js原生方法:document.getElementById("imageId").src = "xxxx.jpg";用Jquery方法:$("#i ...
- Jetson tk1 刷机后要做的几件事
参考简书文章: http://www.jianshu.com/p/997ede860d74 1. 查看Jetson TK1 L4T版本 head -n 1 /etc/nv_tegra_release ...
- 【vim】实时加密文本 ggVGg?
如果你不想让别人看懂你的屏幕上的内容,你可以使用一个内置的选项,通过下面的命令使用 ROT13 来对文本进行编码: ggVGg? gg 把光标移动到 Vim 缓冲区的第一行, V 进入可视模式, G ...
- STM32F103X datasheet学习笔记---DMA
1.前言 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输. 无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 两个DMA控制器 ...