Python socket学习笔记(一)
最近在看 Python的视频,针对socket 编程做一个笔记
一、socket是什么?
socket 通常也称为“套接字”,用于描述 IP 地址和端口,是一个通讯链的句柄。应用程序通常通过 “套接字”向网络发出请求或者应答网络请求。说白了,就是一种通讯机制。它类似于公司的电话客服部门,你打电话的时候,那边会分配一个人回答你的问题,客服部门就相当于 socket 的服务器端了,打电话的人相当于客户端了,在和你通话结束前,如果有人在想找和你通话的哪个客服人员,是不可能的,因为你在和他通话,当然客户部门的电话交换机也不会重复分配。
socket 起源于 Unix,而Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用 “打开open ->读写 wirte/read -> 关闭 close “模式来操作。 Socket就是该模式的一个实现, socket即时一种特殊的文件,一些 socket函数就是对其进行操作(读/写IO、打开、关闭)
socket 的工作模式
Socket 服务器端 编程主要包括以下几步
- 打开 socket
- 绑定到一个地址和端口
- 侦听进来的连接
- 接受连接
- 读取数据
Socket type
socket.AF_UNIX 只能够用于单一的 Unix 系统进程间通信
socket.AF_INET 服务器之间网络通信
socket.AF_INET6 IPv6
socket.SOCK_STREAM 流式socket,for TCP
socket.SOCK_DGRAM 数据报式socket, for UDP
socket.SOCK_RAW 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文,此外,利用原始套接字,可以通过 IP_HDRINCL套接字选项由用户构造IP头
socket.SOCK_RDM 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RDM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。
SOCK_RAM 通常仅限于高级用户或管理员运行的程序使用
socket.SOCK_SEQPACKET 可靠的连续数据包服务
Socket 函数
socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字
套接字的实例具有以下方法:
1、s.bind(address) 将套接字绑定到地址。address地址的格式取决于 地址族。 在AF_INET下,以元祖(host,port)的形式表示地址 2、s.listen(backlog) 开始监听传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设置为5就可以了。 3、s.connect(address) 连接到address 处额套接字,一般,address的格式为元组(hostname,port),如果连接同一台机器上的服务器,可以将hostname 设置为 ‘localhost’. 如果连接出错,返回 socket.error 错误。 4、s.connect_ex(address) 功能与 connect(address) 相同,但是成功返回 0 ,失败返回 errno 的值。 5、s.accept() 接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据,address时候连接客户端的地址。 6、s.close() 关闭套接字。 7、s.fileno() 返回套接字的文件描述符 8、s.getpeername() 返回套接字的远程地址。返回值通常是元组(ipaddr,port) 9、s.getsockname() 返回套接字自己的地址。通常是一个元组(ipaddr,port) 10、s.getsockopt(level,optname[,buflen]) 返回套接字选项的值 11、s.gettimeoout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None 12、s.recv(bufsize [,flag]) 接受套接字的数据。数据以字符串形式返回,bufsize 指定要接受的最大数据量。flag 提供有关信息的其他信息,通常可以忽略。 13、s.recvfrom(bufsize [,flag]) 与 recv() 类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址 14、s.send(string [,flag]) 将 string 中的数据发送到连接的套接字,返回值是要发送的字节数量,该数量可能小于 string 的字节大小。 15、s.sendall(string [,flag]) 将 string 中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据。成功为None,失败则抛出异常 16、s.sendto(string [,flag],address) 将数据发送给套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议 17、s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设置为阻塞模式(默认值)。非阻塞模式下,如果调用 recv() 没有发现任何数据,或 send() 调用无法立即发送数据,那么将引起 socket.error 异常 18、s.setsocketopt(level,optname,value) 设置给定套接字选项的值 19、s.settimeout(timeout) 设置套接字操作的超时期,timeout 是一个浮点数,单位是秒。值为 None 表示没有超时期。一般,超时期应该在刚创建套接字的时候后设置,因为他们可能用于连接的操作(如 connect())