[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地址
- 基础部分
- 基础知识
- 变量
- 数据类型
- 数字与布尔详解
- 列表详解list
- 字符串详解str
- 元组详解tup
- 字典详解dict
- 集合详解set
- 运算符
- 流程控制与循环
- 字符编码
- 编的小程序
- 三级菜单
- 斐波那契数列
- 汉诺塔
- 文件操作
- 函数相关
- 函数基础知识
- 函数进阶知识
- lambda与map-filter-reduce
- 装饰器知识
- 生成器和迭代器
- 琢磨的小技巧
- 通过operator函数将字符串转换回运算符
- 目录规范
- 异常处理
- 常用模块
- 模块和包相关概念
- 绝对导入&相对导入
- pip使用第三方源
- time&datetime模块
- random随机数模块
- os 系统交互模块
- sys系统模块
- shutil复制&打包模块
- json&pickle&shelve模块
- xml序列化模块
- configparser配置模块
- hashlib哈希模块
- subprocess命令模块
- 日志logging模块基础
- 日志logging模块进阶
- 日志重复输出问题
- re正则表达式模块
- struct字节处理模块
- abc抽象类与多态模块
- requests与urllib网络访问模块
- 参数控制模块1-optparse-过时
- 参数控制模块2-argparse
- pymysql数据库模块
- requests网络请求模块
- 面向对象
- 面向对象相关概念
- 类与对象基础操作
- 继承-派生和组合
- 抽象类与接口
- 多态与鸭子类型
- 封装-隐藏与扩展性
- 绑定方法与非绑定方法
- 反射-字符串映射属性
- 类相关内置方法
- 元类自定义及单例模式
- 面向对象的软件开发
- 网络-并发编程
- 网络编程SOCKET
- socket简介和入门
- socket代码实例
- 粘包及粘包解决办法
- 基于UDP协议的socket
- 文件传输程序实战
- socketserver并发模块
- 多进程multiprocessing模块
- 进程理论知识
- 多进程与守护进程
- 锁-信号量-事件
- 队列与生产消费模型
- 进程池Pool
- 多线程threading模块
- 进程理论和GIL锁
- 死锁与递归锁
- 多线程与守护线程
- 定时器-条件-队列
- 线程池与进程池(新方法)
- 协程与IO模型
- 协程理论知识
- gevent与greenlet模块
- 5种网络IO模型
- 非阻塞与多路复用IO实现
- 带着目标学python
- Pycharm基本使用
- 爬虫
- 案例-爬mzitu美女
- 案例-爬小说
- beautifulsoup解析模块
- etree中的xpath解析模块
- 反爬对抗-普通验证码
- 反爬对抗-session登录
- 反爬对抗-代理池
- 爬虫技巧-线程池
- 爬虫对抗-图片懒加载
- selenium浏览器模拟