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         
        中国

"""
View Code

 

猜你喜欢

转载自www.cnblogs.com/wuchenggong/p/9150791.html
今日推荐