1、socket模块 2、TCP通讯(服务器|客户端) 3、常见的异常 4、循环通讯
1、socket 套接字
本质上是一个模块,里面封装了一些网络通讯协议 是处于传输层和应用层之间的一个抽象层,实际在OSI七层协议中并不存在 也就是没有socket也能能够通讯 ,但是这样一来 我们必须完全按照OSI规定的各种协议来编码 这是一个重复,复杂的过程,为了提高开发效率,就出现了socket模块,专门帮我们封装了传输层中的一堆协议,有socket模块之后 当我们需要编写网络通讯的程序时,就不需要在关心具体的协议细节,直接使用socket模块提供的功能接口即可
2、TCP通讯
网络通讯一定分为两端,服务器和客户端
服务器:
1.创建socket对象 server = socket.socket()
2.绑定一个固定的ip和端口 server.bind ip必须是本机ip 端口1024-65535 不要使用常见的端口 web:80 / 8080 mysql 3306 ssh:22 ftp:21
3.开始监听客户端的到来 server.listen
4.接收客户端的链接请求 server.accept # 阻塞直到客户链接到来 没有新连接则不可能执行该函数
5.收发数据 需要循环 recv 收 收多少字节数 send 发 只能发二进制数据
客户端:
1)创建socket对象 client = socket.socket()
2)链接服务器 client.connect((ip,port))
3)收发数据 通常需要循环 send 发 只能发二进制数据 recv 收 收多少字节数
4)断开链接 client.close()
3、常见的异常
1)一方异常下线,另一方还要收发数据 ,ConnectionResetError 在send recv的地方 加上try 客户端也需要异常处理
在数据传输中
在Linux中,如果客户端下线了,服务器不会抛出异常,只会收到空消息
windows中,当客户端正常关闭时,服务器会收到空消息
所以需要加入判断,为空时,跳出循环,结束进程
2)端口占用异常
重复运行服务器,之前的进程没有正确关闭,关闭和打开端口,都是操作系统负责
在一些极端情况下,可能应用程序已经正确接收并且通知了操作系统要关闭端口,
但是操作系统并没及时处理
解决方式: 1 更换端口 2 查后台进程 杀掉它 3 重启服务器电脑
4、循环通讯
while Ture