1)网络中的进程间通信
在本地可以通过进程PID来唯一标识一个进程,但是在网络中这却是行不通的。
TCP/IP协议族已经解决了这个问题,网络层的“IP地址”可以唯一标识网络中的主机,而传输层“协议+端口”可以唯一标识主机中的应用程序(进程)。
这样利用 IP地址,协议,端口 就可以表示网络中的进程了,网络中的进程通信就可以利用这个标志与其他进程进行交互。
2)什么是socket
socket简称套接字,是进程间通信的一种方式;它能实现不同主机间的进程间通信。
socket是应用层与TCP/IP协议族通信中间软件抽象层,它是一组接口。
在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在socket接口后面,对于用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议;进而,我们无需去关心TCP/UDP协议的细节,因为socket已经封装好了,我们只需要遵循socket的规定去编程,自然就是遵循tcp/udp标准的。
3)socket层
基于文件类型的套接字家族:AF_UNIX
基于网络类型的套接字家族:AF_INET
1)工作流程图示
2)工作流程解释
1)创建socket示例
import socket socket.socket(socket_family,socket_type,protocal=0) # socket_family 可以是 AF_UNIX 或 AF_INET # socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM # protocol 一般不填,默认值为 0 # 获取tcp/ip套接字 tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 获取udp/ip套接字 udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 由于 socket 模块中有太多的属性,在这里破例使用了‘from module import *‘语句 # 使用 ‘from socket import *‘, 就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码 # 例如tcpSock = socket(AF_INET, SOCK_STREAM)
2)服务端套接字函数
s.bind() # 绑定(主机,端口号)到套接字 s.listen() # 开始TCP监听 s.accept() # 被动接受TCP客户的连接,(阻塞式)等待连接的到来
3)客户端套接字函数
s.connect() # 主动初始化TCP服务器连接 s.connect_ex() # connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
4)公共用途的套接字函数
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() # 关闭套接字
5)面向锁的套接字方法
s.setblocking() # 设置套接字的阻塞与非阻塞模式 s.settimeout() # 设置阻塞套接字操作的超时时间 s.gettimeout() # 得到阻塞套接字操作的超时时间
6)面向文件的套接字的函数
s.fileno() # 套接字的文件描述符 s.makefile() # 创建一个与该套接字相关的文件
原文:https://www.cnblogs.com/hgzero/p/13501849.html