zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    如何理解和计算活跃度。做了张脑图。欢迎大家提意见
    在虚拟服务器调试castle项目
    生成缩略图
    自己写的分页函数
    asp.net2.0 自带的邮件发送
    在.NET下如何用WebService实现身份认证,及如何跟踪用户的访问,如类似Possport的功能,不会还是用Session吧?
    邮箱验证
    ASP.NET菜鸟之路之Request小例子
    ASP.NET菜鸟之路之Seesion小例子
    ASP.NET菜鸟之路之Response小例子
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9150791.html
Copyright © 2011-2022 走看看