• python网络编程 day29 网络编程初识 ——tcp与udp、struck模块


    一、内容回顾

    • osi五层模型

      • 应用层

      • 传输层

        • 四层交换机、四层路由器

        • TCP

          • 可靠的全双工通信

          • 效率低

          • 三次握手

            • 客户端向服务端发送syn请求

            • 服务端回复客户端ACK并发送syn请求

            • 客户端回复服务端ACK表示建立连接

            • 由客户端的connect + 服务端的accept

          • 四次挥手

            • 服务端向客户端发送fin请求

            • 客户端收到请求回复ACK

            • 客户端发送fin请求

            • 服务端收到请求回复ACK确认

            • 由客户端的close与服务端的close完成

        • UDP:

          • 效率高

          • 不可靠的连接

          • 无连接

      • 网络层

        • ip协议(ipv4,ipv6)

        • 路由器、交换机

      • 数据链路层

        • arp协议,地址解析协议,通过IP找mac地址

      • 物理层

    二、今日内容

    • tcp协议

      • 在连接内多和客户端说几句

      • 能够接收到读懂个客户端的请求

    #cleint 客户端
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8001))
    while True:
       ret = sk.recv(1024)
       print(ret.decode('utf-8'))
       if ret.decode('utf-8') == 'Q':
           break
       msg = input('>>>>>')
       sk.send(msg.encode('utf-8'))
       if msg.upper() == 'Q':
               break
    sk.close()
    #server  服务端
    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1',8001))
    sk.listen()
    while True:
       conn,addr = sk.accept()  #三次握手
       while True:
           msg = input('>>>>')
           conn.send(msg.encode('utf-8'))
           if msg == 'Q':
               break
           ret = conn.recv(1024)
           print(ret.decode('utf-8'))
           if ret.decode('utf-8') == 'Q':
               break
       conn.close()  #四次挥手
    sk.close()

     

     

    • udp协议的编程

      #client 客户端
      import socket
      sk = socket.socket(type=socket.SOCK_DGRAM)
      server_ip = ('127.0.0.1',9001)
      while True:
         msg = input('>>>>>')
         sk.sendto(msg.encode('utf-8'),server_ip)
         if msg.upper() == 'Q':break
         msg_recv = sk.recv(1024).decode('utf-8')
         if msg_recv.upper() == 'Q':break
         print(msg_recv)
      #server 客户端
      import socket
      sk = socket.socket(type=socket.SOCK_DGRAM)
      sk.bind(('127.0.0.1',9001))
      while True:
         msg,addr = sk.recvfrom(1024)
         print(msg.decode('utf-8'))
         msg_send = input('请输入》》》》》')
         sk.sendto(msg_send.encode('utf-8'),addr)

       

     

    • 粘包现象

      • 只出现在tcp协议中,多条消息之间没有边界,并且还有一大堆优化的算法

      • 出现位置

        • 发送端:两条新消息都很短,发送间隔时间也很短

        • 接收端:多条消息由于没有及时接收,而在接收方的缓存端,堆在一起了

      • struck模块处理粘包问题

        • 每次传输之前把传输的长度发送到接收方,接收方每次在接收消息时,先接收长度,,然后在接收数据

        import struct
        s = 'fhdakjdhjka'
        ret = struct.pack('i',len(s))
        print(ret)
        res = struct.unpack('i',ret)
        print(res)
        print(res[0])

         

     

     

     

     

    三、作业

    • 文件发送 tcp

    • 聊天程序 udp

     

  • 相关阅读:
    WinPE U盘安装原版Win10系统详细教程
    Foxmail for windows 客户端设置和 IMAP、POP3/SMTP 的设置
    微信打开X5调试,使微信页面可以在谷歌浏览器调试
    古今时辰对照表--选择吉日吉时,养生时辰必看
    2020爱你爱你,新的一年,新的开始,2020我想对你说
    人民日报推荐好文《善待你所在的单位》
    致大学生,我把私藏多年的的实用工具/学习网站都贡献出来了~~
    使用poco 的NetSSL_OpenSSL 搭建https 服务端,使用C++客户端,java 客户端访问,python访问(python还没找到带证书访问的代码.)
    C++ activemq CMS 学习笔记.
    关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记.
  • 原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14295368.html
Copyright © 2020-2023  润新知