概述
Socket是应用层与TCP/IP协议族通信的中间软件抽象层。
复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
要进行socket编程,发送网络消息,我们可以使用 Python 内置的 socket 库 。
目前的socket编程,使用的最多的就是通过TCP协议进行网络通讯的。
TCP进行通讯的程序双方,分为服务端和客户端。
TCP 协议进行通讯的双方,是需要先建立一个虚拟连接的。然后双方程序才能发送业务数据信息。
建立TCP虚拟连接是通过著名的 三次握手 进行的。
TCP服务端程序
详解
首先需要导入socket 库
Python里面对Socket接口的调用全部封装到了socket库里了。
1 | from socket import * |
定义配置项
1 | # 等待客户端来连接 |
这个IP是指“哪个IP可以连接你这个服务端“
如果IP = '0.0.0.0'
就表示所有IP地址都可以连接这个服务端。
实例化一个Socket
对象
1 | listenSocket = socket(AF_INET, SOCK_STREAM) |
- 参数
AF_INET
表示该socket网络层使用IP协议 - 参数
SOCK_STREAM
表示该socket传输层使用TCP协议
listenSocket.bind((IP, PORT))
绑定IP和PORT后,表示将监听该端口号和IP地址。
listenSocket.listen(8)
,然后就进入等待连接的状态,最多接受8个客户端。
获取请求
1 | dataSocket, addr = listenSocket.accept() |
返回的是一个元组,用两个变量接收
- dataSocket:是一个新的Socket对象。
- addr:是客户端地址,包括(IP地址,端口号),例如:
('127.0.0.1', 61799)
。
注意:当调用了 accept() 方法,服务端程序就处于了阻塞状态,一直等待连接,如果没有连接,下面的代码就不会执行。直到接收到了连接。
接收数据并处理
1 | while True: |
recv(BUFLEN)
方法返回的是 字节串类似Java的字节流,如果客户端关闭了,那么就会返回b''
。
str.decode(encoding='UTF-8',errors='strict')
字符串解码默认使用
UTF-8
errors – 设置不同错误的处理方案。默认为
strict
,意为编码错误引起一个UnicodeError。其他可能得值有
ignore
,replace
,xmlcharrefreplace
,backslashreplace
以及通过 codecs.register_error() 注册的任何值。
str.encode(encoding='UTF-8',errors='strict')
字符串编码【参数和decode()
一样】
收发数据不一定是字符串,可以是其他数据,比如 图片音频等…
recv(BUFLEN) 方法也会使程序处于阻塞状态,一直等待的是数据,而accept() 等待的是连接。
最后关闭连接
1 | # 服务端也调用close()关闭socket |
完整代码
1 | # === TCP 服务端程序 server.py === |
TCP客户端程序
经过服务端程序讲解,客户端的程序就不做详解。一样,直接上代码
1 | # === TCP 客户端程序 client.py === |
其实,客户端的connect() 方法对应着服务端的 accept()方法,进行了三次握手。
__END__