c++ socket send file_Python 中的 socket 深入使用

226476d6fc358f5f2810b9622e98984b.png
封面图片来源:沙沙野

内容概览

  1. 服务端持续等待的解决方式
  2. 使用 socket 上传文件
  3. UDP 协议基本用法
  4. 使用 UDP 协议实现多人聊天功能
  5. 验证客户端的合法性
  6. 使用 socketserver 来实现 TCP 协议 socket 的并发

服务端持续等待的解决方式

  1. 之前的示例都是如果客户端停止通信了,服务端也会跟着停止。那么,如何让服务端与一个客户端的用户聊天退出后,还能继续等待下一个客户端的用户聊天呢?——解决思路:还是可以尝试用 whie 循环
  2. server.py 中的内容
import 

3. client.py 中的内容

import 

4. 运行两个文件,发现如果客户端输入 q 退出程序后,再次重启客户端(相当于另一个用户进入),还能继续和服务端通信

# server.py

使用 socket 上传文件

  1. 整体的解决思路先捋一遍,首先客户端在上传文件之前:
  • 先向服务端传递该文件的相关信息,比如文件大小、文件名以及要做的操作等,这时就要用到 send
  • 但是又有可能与下一个 send 发生粘包现象,因此还要使用 struct 模块。

2. 下一步,客户端要开始向服务端传文件,大概步骤:

  • 打开文件
  • 读取文件内容:按照固定字节读取,比如该文件有 5000 个字节,每次向服务端发送 1024 个字节,这样的话要 send 五次,但是不用担心粘包问题

3. 最后,服务端的接收步骤:

  • 先接收 4 字节,知道了文件信息的长度
  • 按照长度接收文件信息
  • 从文件信息中得到文件的大小
  • 开始接收,直到收完文件大小这么多的数据

4. 按照上面的思路,先写 client.py 的内容

import 

5. 接着写 server.py 的内容

import 

6. 这里有问题,如果把这里的『 content = conn.recv(1024) 』的 1024 和 client.py 里的 1024 都改为 2048 或者更大的数,运行结束后发现查看该文件时文件大小变小了。原因是这里虽然指定每次接收 1024 个字节,但不代表每次一定就能接收到 1024 个字节,比如最后还剩 200 多字节,就会发生拆包现象。为了解决这个问题,可以这样:

# server.py

UDP 协议基本用法

  1. 还记得之前发的 TCP 协议与 UDP 协议的流程图吗?再来回顾一下,看看两者之间的区别

29bb7b463915242b49a987992754977a.png

2. server.py 内容

import 

3. client.py 的内容

import 

使用 UDP 协议实现多人聊天功能

  1. server.py
import 

2. client.py

import 

验证客户端的合法性 (了解)

  1. server.py
import 

2. client.py

import 

3. 运行后得出结果:是合法的客户端。只要两边的secret_key的值不一样,服务端就知道不是合法的客户端

使用 socketserver 来实现 TCP 协议 socket 的并发

  1. socket是基于socketserver的下层模块,socketserver是基于socket的上层模块,因此 socketserver 可以实现并发
  2. server.py
import 

3. client.py,写几个内容一样的客户端文件,进行测试即可

import 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值