Socket协议概要
创建socket的时候,需要一些选项来说明本次使用协议具体是什么,常用的两个:
由此产生的不同组合:
但目前TCP(IPV4)是主流,SOCK_STREAM+AF_INET
创建和使用Socket
socket模块中有socket类: socket.socket
- 接收数据的方法
- 发送数据的方法
- 监听端口的方法
socket函数:
- 创建客户端
- 创建服务端
- 创建客户端+服务端(已连接)
- ……
相关函数:
-
基本函数
-
便捷函数
-
- 创建服务端socket
1 创建socket
2 绑定地址(ip+port)
3 监听地址
- 创建服务端socket
怎么判断判断是否连接成功,我们可以在连接之后打断点,并在命令行查看是否监听,用netstat -ano | findstr 端口号
-
- 创建客户端socket
1 创建socket
2 绑定地址(ip+socket)
3 向指定的服务端发起链接
- 创建客户端socket
-
- 创建已连接的socket
1 创建两个socket,其中一个座位server监听端口,另一个座位client连接端口
2 连接成功后,把两个socket返回
查看pid 得到通信状态:
只有两个连接,是没有监听状态的,所以不会有其他链接进来,只能有这两个。
- 创建已连接的socket
Socket对象
socket提供了一系列方法完成网络连接、数据通信,常用的有:
-
网络连接
-
- 服务端
1 bind绑定地址(ip+port
2 listen监听端口,允许其他socket发起连接
3 accept接收连接,生成新的socket,完成数据收发
4 cloese 关闭连接
- 服务端
-
- 客户端
1 bind绑定地址(ip+port
2 connect连接指定地址
3 cloese 关闭
- 客户端
-
数据通信(IO)
-
- sendall 发送数据
-
- recv 接收数据
配置日志
创建服务端代码:
创建客户端代码:
通信:传递二进制数据流
server.accept()的返回值是一个新的socket连接和连接的客户端地址,
server只做一个事情,就是用来监听并创建新的连接
发送信息由客户端发送,conn用来接收并发送返回信息
使用便捷函数完成上述功能:
创建服务端监听python3.8+:
创建客户端连接:
通信部分代码不变
使用TTD方法实现socket编程
测试驱动开发TDD:
1 编写测试用例
2 执行测试用例(测试失败-红
3 编写业务代码
4 执行测试用例(测试成功-绿
5 重构代码
6 执行测试用例
内置的socketserver
socketserver
预制了常见了socketserver:
TCPServer
ThreadingTCPServer
ForkingTCPServer
1能够处理客户端中断的异常,不会导致server退出
2提供了并发的支持
3 将网络连接、数据处理分开
ThreadingTCPServer使用
socket聊天室:多人同时在线每个人都可以发言,发言内容每个人都能收到
协议:
header:固定长度,申明body长度
body:不固定长度
结束标记:以某个字符串作为结束标记(“\n”)
使用TCP进行传输
数据格式:name msg time ,使用json字符串{“name”:“张三”,“msg”:“你好”,“time”:“2024-2-24”}
编写客户端
-
1 建立socket, 断开socket
-
2 发送消息能力:
2.1 确定要发送的内容
2.2 组装固定格式的字典
2.3 将字段转字符串
2.4 字符串+\n
2.5 字符串转字节流
2.6 借助socket发送字节流 -
3 接收消息能力
3.1 从socket读取字节流
3.2 字节流转字符串
3.3 去掉结束标记
3.4 字符串转字典
3.5 返回字典
发送:
接收:
socket链接的建立和断开:
编写相关测试用例
夹具:启动和关闭服务器
举例:可回复消息用例
其余用例可 以上述用例为基础进行拓展
todotodo: