内容回顾

  • tcp协议的多人多次通信

    • 和一个人通信多说句话
    • 和一个人聊完再和其他人聊
    • bind 绑定一个id和端口
    • socket()tcp协议的server
    • listen 监听,代表socket服务的开启
    • accept 和客户端建立连接的过程
    • send 直接通过连接发送消息,不需要地址
    • recv 只接收消息
    • connect 客户端、tcp协议的方法,和server端建立连接
    • close 关闭服务、连接
  • udp协议的多人通信

    • socket(type=socket.SOCK_DGRAM)
    • sendto 需要写一个对方的地址
    • recvfrom 接收消息和地址
    • close 关闭服务、连接
  • 每句话什么意思?执行到哪程序等待、阻塞、结束阻塞?

    • input() 等待
    • accept 阻塞,有客户端来和我建立连接就结束阻塞
    • recv 阻塞,直到收到对方发来的消息结束阻塞
    • recvfrom 阻塞
    • connect 阻塞,直到server端结束了对一个client的服务,开始和当前client建立连接的时候结束阻塞
  • 粘包现象

    • 什么是粘包

      • 两条或更多条分开发送的信息连在一起
    • 发生在发送端:发送间隔短,数据小,由于优化机制就合并在一起发送了
    • 发送在接收端:接收不及时,所以数据就在接收方的缓存端黏在一起了
    • 粘包发生的本质:tcp协议的传输是流式传输,数据与数据之间没有边界
    • 怎么解决粘包:自定义协议 struct模块
      • 发送端

        • 先发送四字节的数据长度
        • 再按照长度发送数据
      • 接收端
        • 先接受四字节 知道数据长度
        • 再按照长度接收数据
  • tcp文件传输

    • import socket
      import json
      #接收
      sk=socket.socket() #创建套接字
      sk.bind(('127.0.0.1',9000)) #绑定端口
      sk.listen() conn,_=sk.accept()
      msg=conn.recv(1024).decode('utf-8')
      print(msg)
      msg=json.loads(msg) with open(msg['filename'],'wb')as f:
      content=conn.recv(msg['filesize'])
      print('---->',len(content))
      f.write(content) conn.close()
      sk.close()
      import socket
      import os
      import json
      # 发送
      sk=socket.socket() #创建套接字
      sk.connect(('127.0.0.1',9000)) # 文件名、文件大小
      abs_path=r'E:\Py Project\day30\tmp'
      filename=os.path.basename(abs_path)
      filesize=os.path.getsize(abs_path)
      dic={'filename':filename,'filesize':filesize}
      str_dic=json.dumps(dic)
      sk.send(str_dic.encode('utf-8')) with open(abs_path,mode='rb') as f:
      content=f.read()
      sk.send(content) sk.close()

今日内容

  • tcp协议的自定义协议解决粘包问题

  • 验证客户端合法性

  • 并发的tcp协议server端---socketserver

代码总行数3030+41=3047行

python30day的更多相关文章

随机推荐

  1. 【LeetCode】1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 代码 复杂度分析 日期 题目地址:http ...

  2. 【LeetCode】1041. Robot Bounded In Circle 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 找规律 日期 题目地址:https://leetco ...

  3. 【LeetCode】328. Odd Even Linked List 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 1198 - Karate Competition

    1198 - Karate Competition    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...

  5. uniapp医院预约挂号微信小程序

    开头感言:最近看小程序很火,也想弄一个看看,用了一些时间从0开始写,也记录了一些笔记,自己用框架写的模板,不是很精美,后面会慢慢优化,功能也是后面慢慢加上去的, 其中功能这块,起初只是一些简单的功能, ...

  6. Dubbo 的设计思想

    在java远程调用多年的沉淀 <1>首先是socket调用.在orderService中开放socket服务,在userService中进行远程调用. 优点:解决了单机调用的问题. 缺点: ...

  7. Loss Landscape Sightseeing with Multi-Point Optimization

    目录 概 主要内容 代码 Skorokhodov I, Burtsev M. Loss Landscape Sightseeing with Multi-Point Optimization.[J]. ...

  8. PlatformIO+Jlink进行调试

    PlatformIO自带调试功能具体配置如下 https://docs.platformio.org/en/latest/plus/debug-tools/jlink.html     我是用的是直接 ...

  9. SpringCloud发现服务代码(EurekaClient,DiscoveryClient)

    1.说明 本文介绍SpringCloud发现服务代码的开发, 通过使用EurekaClient,DiscoveryClient来发现注册中心的服务等, 从而可以自定义客户端对注册中心的高级用法. 2. ...

  10. .net core集成使用consul

    快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...