socket是应用层与TCP/IP协议通信的中间软件抽象层,一组接口.将复杂的tcp/ip协议组隐藏在socket接口后面,无需理解tcp/udp协议,只需遵循socket的规定去编程.
套接字有两种,分别是基于文件型和基于网络型的AF_UNIX,AF_INET
服务器端首先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.
客户端初始化Socket,连接服务器,连接成功客户端与服务器连接建立
服务器套接字函数
s.bind() 绑定(主机,端口号)到套接字
s.listen() 开始tcp监听
s.accept() 被动接受tcp客户的连接(阻塞式)等待连接的到来
客户端套接字函数
s.connect() 主动初始化tcp服务器连接
s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
公共用途的套接字函数
s.recv() 接收tcp数据
s.send() 发送tcp数据(send在发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall() 发送完整的tcp数据(本质是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom() 接收udp数据
s.sendto() 发送udp数据
s.getpeername() 连接到当前套接字的远端的地址
s.getsockname() 当前套接字的地址
s.getsockopt() 返回指定套接字的参数
s.setsockopt() 设置指定套接字的参数
s.close() 关闭套接字
面向锁的套接字方法
s.setblocking() 设置套接字的阻塞与非阻塞模式
s.settimeout() 设置阻塞套接字操作的超时时间
s.gettimeout() 得到阻塞套接字操作的超时时间
面向文件的套接字的函数
s.fileno() 套接字的文件描述符
s.makefile() 创建一个与该套接字相关的文件
基于tcp的套接字
tcp是基于链接的,必须先启动服务端,然后在启动客户端去链接服务端
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 tcp服务端 2 3 复制代码 4 1 ss = socket() #创建服务器套接字 5 2 ss.bind() #把地址绑定到套接字 6 3 ss.listen() #监听链接 7 4 inf_loop: #服务器无限循环 8 5 cs = ss.accept() #接受客户端链接 9 6 comm_loop: #通讯循环 10 7 cs.recv()/cs.send() #对话(接收与发送) 11 8 cs.close() #关闭客户端套接字 12 9 ss.close() #关闭服务器套接字(可选) 13 复制代码 14 tcp客户端 15 16 1 cs = socket() # 创建客户套接字 17 2 cs.connect() # 尝试连接服务器 18 3 comm_loop: # 通讯循环 19 4 cs.send()/cs.recv() # 对话(发送/接收) 20 5 cs.close() # 关闭客户套接字
基于udp的套接字
udp是无链接的,先启动哪一端都不会报错
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 udp服务端 2 3 1 ss = socket() #创建一个服务器的套接字 4 2 ss.bind() #绑定服务器套接字 5 3 inf_loop: #服务器无限循环 6 4 cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送) 7 5 ss.close() # 关闭服务器套接字 8 udp客户端 9 10 cs = socket() # 创建客户套接字 11 comm_loop: # 通讯循环 12 cs.sendto()/cs.recvfrom() # 对话(发送/接收) 13 cs.close() # 关闭客户套接字