内容回顾

  • 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. 【九度OJ】题目1196:成绩排序 解题报告

    [九度OJ]题目1196:成绩排序 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1196 题目描述: 用一维数组存储学号和成绩,然后 ...

  2. 1122 机器人走方格 V4

    1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB  四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子 ...

  3. Anaconda下载与安装

    目录 Anaconda下载与安装 开发环境搭建介绍 Anaconda优势 Anaconda安装 测试安装成功 安装好Anaconda界面 如何启动jupyter 启动后新建文件 执行第一个程序 文件的 ...

  4. opencv学习(六)——图像基本操作

    图像基本操作 一.访问和修改像素值 先来理解一下,图像与一般的矩阵或张量有何不同(不考虑图像的格式,元数据等信息).首先,一张图像有自己的属性,宽,高,通道数.其中宽和高是我们肉眼可见的属性,而通道数 ...

  5. Java基础周测一、二(50题)

    一.单选题 (共50题,250分) 1.下列选项不可作为Java语言变量名的是(    ). A. a1 B. $1 C. _1 D. 21 正确答案: D 2.有一段Java应用程序,它的类名是a1 ...

  6. vue-router 两个子路由之间相互跳转时出错

    patient页面跳转到apply页面后,再点击patient页面后无法跳回 解决方法:使用`${path + path1}` 来自为知笔记(Wiz)

  7. [ vue ] quasar框架踩坑:在vue文件外导入路由,执行router.push('/')没有效果

    问题描述: 1. 如图所示的项目结构目录, axios.js 文件负责拦截全局请求和回复,我在拦截回复的代码中写了:如果服务器回复了一个401错误,则执行Router.push('/'),但是该方法失 ...

  8. a href 鼠标滑过变成小手图标

    <a id="l05" style="cursor:pointer;text-decoration:none;" href="<%=pat ...

  9. VMware 创建的虚拟机,Xshell无法进行连接

    使用场景: 在VMware 创建了Centos7后,Xshell一直连接不上,如果排查以下问题还是不行.就可以用这种方法了 1.配置了静态地址 2.VMware配置了NAT映射,划分了网段后 3.检查 ...

  10. Nagios 请检查HTTP服务器关于该CGI的访问权限设置

    无权查看任何主机的信息. 请检查HTTP服务器关于该CGI的访问权限设置. 搜索了一下方法 确保 htpasswd.user的所有组为nagios 解决办法: vi /usr/local/nagios ...