TCP与UDP协议
1.TCP协议(重点) """凡事必须有回复才能继续""" 三次握手连接 -1.TCP协议也称为可靠协议,数据不容易丢失 数据不容易丢失的原因: 因为存在反馈机制,给对方发送消息后会保留一个副本,知道对方回应消息才会删除该副本,否则会在一定时间内反复发送 -2.洪水攻击 同一时间大量的客户端请求建立连接会导致服务器一直处于SYN_RCVD状态 -3.服务端如何区分客户端建立链接的请求 可以对请求做唯一标识 四次挥手断链接 -1.四次不能合并为三次 因为中间需要确认消息是否发完(TIME_WAIT) 2.UDP协议(数据报协议,不可靠协议) """只管发送。不管查看""" -1.早期的qq就是UDP协议的 -2.使用UDP协议的原因是因为我们只要知道对方地址就可以发消息了,简单,快捷,粗暴
TCP图解三次握手:
TCP图解四次挥手:
socket模块
1.socket也叫套接字 基于文件类型的套接字家族(单机) AF_UNIX 基于网络类型的套接字家族(联网) AF_INET """ socket类似于操作系统,封装了复杂的接口提供简单快捷的接口 """ 2.socket代码:
"""服务端""" import socket # 1.产生一个socket对象并指定采用的通信版本和协议(TCP) server = socket.socket() # 括号内不写参数默认TCP协议 family=AF_INET基于网络的套接字 type=SOCK_STREAM流式协议TCP # 2.绑定一个固定的地址(服务端必备的条件) server.bind(('127.0.0.1',8080)) # 127.0.0.1为本地回环地址,只有自己的电脑可以访问 # 3.设立半连接池 # 当有多个客户端来链接的情况下 我们可以设置等待数量(不考虑并发问题),
# 在测试半连接池的时候 可以不用input获取消息 直接把消息写死即可 server.listen(5) # 4.等待接收消息 sock,addr = server.accept() # return sock,addr 三次握手 print(sock,addr) # 5.接收客户端发送的消息 data = sock.recv(1024) # 接收客户端发送过来的消息 1024字节 print(data.decode('utf8')) sock.senf('发送的消息'.encode('utf8')) # 6.关闭双向通道 sock.close() # 四次挥手 # 7.关闭服务端 server.close() """客户端""" # 1.生成socket对象指定类型和协议 client = socket.socket() # 2.通过服务端发送消息 client.connect(('127.0.0.1',8080)) # 3.直接给服务端发送消息 client.send('回复的消息'.encode('utf8')) # 4.接受服务端发送过来的消息 data = client.recv(1024) print(data.decode('utf8')) # 5.断开与服务端的连接 client.close()
3.代码优化
-1.聊天内容自定义
针对消息采用input获取
-2.让聊天循环起来
将聊天的部分用循环包起来
-3.用户输入的消息不能为空
本质其实是两边一边收(recv),一边发(send)
-4.服务器多次重启可能会报错
Address already in use 主要是mac电脑会报
方式1:改端口号
方式2:博客里面代码拷贝即可
-5.当客户端异常断开的情况下如何让服务端继续服务其他客人
windows服务端会一直报错
mac服务端会有一段时间反复接收空消息延迟报错
要对特殊情况进行异常处理,空消息判断
标签:协议,UDP,socket,TCP,消息,服务端,客户端 From: https://www.cnblogs.com/juzijunjun/p/16896574.html