内容回顾

  • 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】906. Super Palindromes 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS解法 相似题目 参考资料 日期 题目地址:ht ...

  2. C++单元测试框架gtest使用

    作用 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确.单元测试是对软件可测试最小单元的检查和校验.单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成 ...

  3. 带你熟悉鸿蒙轻内核Kconfig使用指南

    摘要:本文介绍了Kconfig的基础知识,和鸿蒙轻内核的图形化配置及进阶的使用方法. 本文分享自华为云社区<鸿蒙轻内核Kconfig使用笔记>,作者: zhushy. 1. Kconfig ...

  4. Spring Boot + MyBatis + MySQL 实现读写分离

    读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做. 读写分离有两种实现方式: 第一种是依靠中间件(比如:MyCat ...

  5. 更新系统为High sierra 后无法使用Cocoapods

    sudo gem update --system sudo gem install -n /usr/local/bin cocoapods执行完就可以直接用了.

  6. <数据结构>XDOJ327.最短路径

    问题与解答 问题描述 求图中任意两个顶点之间的最短路径. 输入格式 输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,-,n-1进行编号).之后的n行每行都包含n个整数,第i行第j ...

  7. Android开发 ListView(垂直滚动列表项视图)的简单使用

    效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...

  8. AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at

    AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at C:\Users\Adminis ...

  9. 初识python: 模块定义及调用

    一.定义 模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是.py结尾的python文件(比如:文件名:test.py,对应的模块名:test) 包:用来从逻辑上组 ...

  10. JMeter_分布式压测配置

    前置条件 电脑A,电脑B,电脑C均安装相同版本的JMeter 和JDK.其中电脑A作为控制机,电脑B和电脑C作为施压机 电脑A IP:172.16.0.114 电脑B IP:172.16.0.115 ...