C/S架构:C指的是客户端 S指的是服务端
socket 别人写好的一组模块用来跟其他计算机实现网络通信由于研究网络协议耗时久 所以开发出一套模块便于使用使用时只要写明协议ip接口即可
使用socket之前要导入模块socket
TCP 服务端:
sock_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 创建套接字对象STREAM为TCP
sock_server.bind((HOST, PORT)) 绑定监听的IP和端口号
sock_server.listen(1) 设置监听的最大连接数
conn, addr = sock_server.accept() 接受对端来的数据元祖并赋值给conn 和addr
conn.recv(1024)接受对端数据 括号中的为字节数
conn.sendall(data) 给对端发送数据数据需为二进制
conn.close() 关闭链接
sock_server.close()关闭sock套接字
## 由于服务端需要监听端口 断开连接后 由于tcp机制会有个timeout等待时间 重启脚本会出现端口占用的情况
有两种解决方案:修改等待时间 或者端口设置复用
端口复用:sock_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
修改等待时间:看操作系统 linux中/etc/sysctl.conf net.ipv4.tcp_fin_timeout 选项修改时间
TCP客户端:
sock_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)创建套接字对象STREAM为TCP
sock_client.connect((HOST, PORT)) 连接服务端的IP和端口号
sock_client.sendall((data))给对端发送数据数据需为二进制
sock_client.recv(1024)接受对端数据 括号中的为字节数
sock_client.close()关闭sock套接字
TCP传输粘包现象:TCP算法机制导致的 1 发送方在极其短暂时间内发了不止一个包 2 接收方前面一个包没有收完
所需,模块struct
解决方案:设置固定字节长度的标识数据长度的信息加在数据开头 接受时约定先接收数据长度信息得到整个数据长度处理
缺点: 由于固定长度字节所以存在极限 超出该极限任然会出现粘包
优化:还是按照上面思路标识传输数据长度 然后将描述数据长度的信息加在数据之前
再以固定长度字节标识描述信息的长度由于描述信息的长度一定是有限的所以可以完美解决
UDP服务端:
sock_server = socket.socket(type=socket.SOCK_DGRAM) 创建套接字 DGRAM 为UDP
sock_server.bind((HOST, PORT))绑定监听的IP和端口号
data, addr = s.recvfrom(1024)接收元祖并赋值 其中包括真正的数据和对端ip与端口
sock_server.sendto(data,addr) 发送数据给对端ip端口 其中数据为二进制
sock_server.close() 关闭套接字
UDP客户端:
sock_client = socket.socket(type=socket.SOCK_DGRAM) 创建套接字 DGRAM 为UDP
sock_client.sendto(data, addr) 发送数据给对端ip端口 其中数据为二进制
data = sock_client.recvfrom(1024)[0] 接收数据索引0上的数据
sock_client.close() 关闭套接字
来源:https://www.cnblogs.com/xiaoxiaoxiamiaixingxing/p/10137568.html