![226476d6fc358f5f2810b9622e98984b.png](https://img-blog.csdnimg.cn/img_convert/226476d6fc358f5f2810b9622e98984b.png)
封面图片来源:沙沙野
内容概览
- 服务端持续等待的解决方式
- 使用 socket 上传文件
- UDP 协议基本用法
- 使用 UDP 协议实现多人聊天功能
- 验证客户端的合法性
- 使用 socketserver 来实现 TCP 协议 socket 的并发
服务端持续等待的解决方式
- 之前的示例都是如果客户端停止通信了,服务端也会跟着停止。那么,如何让服务端与一个客户端的用户聊天退出后,还能继续等待下一个客户端的用户聊天呢?——解决思路:还是可以尝试用 whie 循环
- server.py 中的内容
import
3. client.py 中的内容
import
4. 运行两个文件,发现如果客户端输入 q 退出程序后,再次重启客户端(相当于另一个用户进入),还能继续和服务端通信
# server.py
使用 socket 上传文件
- 整体的解决思路先捋一遍,首先客户端在上传文件之前:
- 先向服务端传递该文件的相关信息,比如文件大小、文件名以及要做的操作等,这时就要用到 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 协议基本用法
- 还记得之前发的 TCP 协议与 UDP 协议的流程图吗?再来回顾一下,看看两者之间的区别
![29bb7b463915242b49a987992754977a.png](https://img-blog.csdnimg.cn/img_convert/29bb7b463915242b49a987992754977a.png)
2. server.py 内容
import
3. client.py 的内容
import
使用 UDP 协议实现多人聊天功能
- server.py
import
2. client.py
import
验证客户端的合法性 (了解)
- server.py
import
2. client.py
import
3. 运行后得出结果:是合法的客户端。只要两边的secret_key的值不一样,服务端就知道不是合法的客户端
使用 socketserver 来实现 TCP 协议 socket 的并发
- socket是基于socketserver的下层模块,socketserver是基于socket的上层模块,因此 socketserver 可以实现并发
- server.py
import
3. client.py,写几个内容一样的客户端文件,进行测试即可
import