多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## Socket介绍 socket把tcp/ip协议层的各种数据封装、数据发送、接收等通过代码已经封装好了,使用者只需要调用几行代码,就可以给别的机器发消息。 ### 什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,**它是一组接口**。把复杂的TCP/IP协议族隐藏在Socket接口后面,用户只需要了解简单的接口使用。 socket起源于Unix的基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式 来操作。 Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭) ### Socket通信套路 当通过socket建立起2台机器的连接后,本质上socket只干2件事,一是收数据,一是发数据,没数据时就等着。 socket 建立连接的过程跟我们现实中打电话比较像,以下是伪代码模拟说明: **接电话方(socket服务器端):** ~~~ 1、买手机(创建socket对象) 2、绑定手机卡(绑定ip和端口) 3、开机(打开监听) 4、等电话链接(建立tcp连接) 5、收发消息(recv和send) 6、挂电话(关闭tcp连接) 7、关机(关闭socket对象) ~~~ **打电话方(socket客户端):** ~~~ 1、买手机(创建socket对象) 4、拨号(与server建立tcp连接) 3、发收消息(send和recv) 4、关机(关闭socket对象) ~~~ ![图解](https://images2015.cnblogs.com/blog/880592/201612/880592-20161201235006318-975867767.png) ## Socket套接字方法 ### **socket 实例类** ``` socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None) ``` **family(socket家族)** * socket.AF_UNIX:用于本机进程间通讯 为了保证程序安全,两个独立的程序(进程)间是不能互相访问彼此的内存的,但为了实现进程间的通讯,可以通过创建一个本地的socket来完成 * socket.AF_INET:用于网络间通信(还有AF\_INET6被用于ipv6) **socket type类型** * socket.SOCK_STREAM tcp类型,低效但可靠的网络传输类型 * socket.SOCK_DGRAM udp类型,高效但不可靠的网路传输类型 **proto=0**请忽略,特殊用途 **fileno=None**请忽略,特殊用途 ### 服务端套接字函数 * s.bind() 绑定(主机,端口号)到套接字 * s.listen() 开始TCP监听 * s.accept() 被动接受TCP客户的连接,(阻塞式)等待连接的到来 ### 客户端套接字函数 * s.connect() 主动初始化TCP服务器连接 * s.connect_ex() 扩展版本,出错时返回出错码,而不是抛出异常 ### 公共用途的套接字函数 * s.recv() 接收数据 * s.send() 发送数据 send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完 * s.sendall() 发送完整的TCP数据 本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完 * s.recvfrom() 从套接字接收数据。返回值是元组(字节、地址) * s.getpeername() 连接到当前套接字的远端的地址 * s.close() 关闭套接字 * socket.setblocking(flag) 设置socket为非阻塞模式,io异步时会用 * socket.getaddrinfo(host, port, family=0, type=0, proto=0, flags=0) 返回远程主机的地址信息 例子: socket.getaddrinfo('baidu.com',80) * socket.getfqdn() 拿到本机的主机名 * socket.gethostbyname() 通过域名解析ip地址