1.什么是socket?
两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?我们经常把socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket是应用层与TCP/IP协议族通信的中间软件层,它是一组接口。在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合之id那个的协议。
所以,我们无需深入理解TCP/UDP协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,那么写出的程序自然是符合TCP/UDP标准的。
2.套接字的种类
我们认识的套接字分为两种:1)基于文件的套接字:AF_UNIX
2) 基于协议的套接字:AF_INET
unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一台机器上可以通过访问同一个文件系统间接完成通信。但是,AF_INET是使用最为广泛的一个,python支持多种地址家族,但是我们只关心网络编程,所以大部分我们只是用AF_INET。
3.套接字的使用
1)基本使用
import socket # 买手机 默认得到是一个TCP的socket server = socket.socket() server.bind(("127.0.0.1",16888)) # 绑定手机卡 server.listen() # 开始待机 # 得到对方的socket对象与地址 client,addr = server.accept() # 接收通话请求 # 该函数会阻塞 直到有连接请求过来 # buffersize 表示应用程序的缓冲区大小 recv其实是 从系统缓冲区读取数据到应用程序 data = client.recv(1024) # 该函数会阻塞 直到操作缓冲区有数据位置 print("收到客户端发来的数据:%s" % data.decode("utf-8")) # 发生的数据必须为bytes类型 client.send(data) client.close() #挂断电话 server.close() # 关机