tcp套接字socket编程
套接字:进行网络通信的一种手段,socket
流式套接字(SOCK_STREAM):传输层基于tcp协议进行通信
数据报套接字(SOCK_DGRAM):传输层基于udp协议进行通信
原始套接字:访问底层协议的套接字
流式套接字:
TCP服务端
from socket import *
1、创建套接字
socket(scoket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
功能:创建套接字
参数:socket_family:选择地址族种类AF_INT(UNIX)
socket_type:套接字类型SOCK_STREAM(流式),SOCK_DGRAM数据报
proto:子协议类型默认为0
返回值:返回创建的套接字
2、绑定IP和端口号
sockfd.bind()
功能:绑定IP和端口
参数:是一个元组,第一项是字符串形式的IP,第二项是端口号
('192.168.1.2',8888)
3、让套接字具有监听功能
sockfd.listen(n)
功能:使套接字变为监听套接字,同时创建监听队列
参数:n监听队列大小
4、等待客户端连接
socket.accept()
功能:阻塞等待客户端连接
返回值:第一个:返回一个新的套接字用来和客户端通信
第二个:返回连接的客户端的地址
5、消息的收发
recv(buffer)
功能:接受消息
参数:一次接受消息的大小 字节
返回值:接受到的内容
send()
功能:发送消息
参数:发送的内容(byte)
返回值:发送了多少个字节
6、关闭套接字
close()
功能:关闭套接字
tcp客户端流程
1、创建流式套接字
2、发起连接请求
connect()
功能:发起连接
参数:一个元组 第一个元素:服务器的IP,第二个元素:服务器的port
3、收发消息
4、关闭套接字
关于recv和send
发送接受缓冲区:发送和接收消息均放到缓冲区再进行处理
recv接收消息当一次接受不完的时候会下次继续接收
当recv阻塞时,如果客户端断开,则recv立即返回一个空字符串
tcp粘包处理
tcp中数据以数据流的方式发送接收,每次发送的数据间没有边界,在接收时可能造成数据的粘连即使为粘包
粘包如何处理:
1、每次发送消息结束位置加标志
2、发送的消息添加结构描述
3、当连续发送时每次发送有一个短暂延迟sleep(0.1)