一、昨日内容回顾

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

  1. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  2. 【python之路35】网络编程之socket相关

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

  3. python 全栈开发,Day92(编程式的导航,vue页面布局,marked包的使用)

    昨日内容回顾 1. 组件间的传值 1. bus --> 空Vue对象 通过向bus对象抛出自定义事件的方式在组件间传递信息 2. 注意事项: 1. bus.$on()应该在组件mounted(挂 ...

  4. Python全栈开发-Day8-Socket网络编程

    本节内容 断言 Socket构建框架 ftp构建框架 Socket粘包 Socket介绍 Socket参数介绍 基本Socket实例 通过Socket实现简单SSH SocketServer 支持多用 ...

  5. python 全栈开发,Day26(hashlib文件一致性,configparser,logging,collections模块,deque,OrderedDict)

    一.hashlib文件一致性校验 为何要进行文件一致性校验? 为了确保你得到的文件是正确的版本,而没有被注入病毒和木马程序.例如我们经常在网上下载软件,而这些软件已经被注入了一些广告和病毒等,如果不进 ...

  6. python全栈开发- day14列表推导式、生成器表达式、模块基础

    一.列表推导式 #1.示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i fo ...

  7. python 全栈开发之路 day1

    python 全栈开发之路 day1   本节内容 计算机发展介绍 计算机硬件组成 计算机基本原理 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可 ...

  8. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  9. python全栈开发-Day7 字符编码总结

    python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...

随机推荐

  1. .NET面试题系列(十)委托与事件

    委托 有了委托的存在,使得方法可以作为参数传递给另一个方法. int Max(int x,int y) { return x>y?x:y; } int Min(int x,int y) { re ...

  2. I2C和SPI总线对比

    1 iic总线不是全双工,2根线SCL SDA.spi总线实现全双工,4根线SCK CS MOSI MISO 2 iic总线是多主机总线,通过SDA上的地址信息来锁定从设备.spi总线只有一个主设备, ...

  3. 解决idea中找不到程序包和找不到符号的问题

    问题如图: 解决方法: 将三处编码都设置成UTF-8,亲测有效 本人也是拜读大佬博客后解决的: http://www.cnblogs.com/wzhanke/p/4747966.html

  4. MySQL - 日常操作一 增删改查

    mysql 源码安装 创建 mysql  账户 组 groupadd mysql useradd mysql -g mysql -M -s /bin/false 解压缩源码安装 .tar.gz cd ...

  5. 洛谷 P2257 YY的GCD

    洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...

  6. mysql timestamp时区有影响

    timestamp格式 如果数据库修改时区,可能会对数据影响,datetime不依赖数据库时区

  7. 前端mock数据的几种方式

    方式 备注 本地php服务架设 直接输出json 使用在线mock服务 如easyMock.apizza.Rap1\2 , 可以远程协作  本地node服务:koa+mongodb    本地node ...

  8. Django学习手册 - 初识自定义分页

    核心: <a href='http://127.0.0.1:8000/index-%s'>%s<a> 自定义分页 1.前端处理字符 后端的字符  return render(r ...

  9. ODPS

    ODPS 功能之概述篇 原文  http://blog.aliyun.com/2962 主题 SQL 概述 ODPS是阿里云基于自有的云计算技术研发一套开放数据处理服务(Open Data Proce ...

  10. 用C++的 new 代替 C 的 malloc 进行内存分配

    例子: (int*)malloc(100*sizeof(int)) 是先取得int类型的字节宽度,然后乘100计算后得到400,然后调用malloc,并将400传递给函数,分配400字节的内存空间,但 ...