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

 

原文地址:https://www.cnblogs.com/iaoyuyuyuhuanghuang/p/14295368.html