python网络学习笔记——socket模块官方文档学习记录

学习一个python新方向,就是学习相应库的使用。

socket模块

此文章记录了socket模块的一些常用常量、参数、类及对应的属性和方法。对于新手不理解的概念、属性、方法进行适当的删减,聚焦于核心的内容。(模块的详细内容请查询官方socket模块文档。)
socket模块:底层的网络接口。该模块提供了访问BSD套接字的接口。

套接字定义

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口(百度百科)。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建一个socket实例

该实例具有的属性

(不必强行理解,知道即可)

s.family:套接字的协议簇(网络传输协议)。
s.type:套接字的类型(具体信息前往:套接字百度百科#类型)。
s.proto:套接字的协议。

>>> s.family
<AddressFamily.AF_INET: 2>
>>> s.type
<SocketKind.SOCK_STREAM: 1>
>>> s.proto
0

该实例具有如下方法
s.close():
将套接字标记为关闭。当 makefile() 创建的所有文件对象都关闭时,底层系统资源(如文件描述符)也将关闭。一旦上述情况发生,将来对套接字对象的所有操作都会失败。对端将接收不到任何数据(清空队列数据后)。 垃圾回收时,套接字会自动关闭,但建议显式 close() 它们,或在它们周围使用 with 语句。

s.dup()创建套接字的副本。

s.makefile(mode=‘r’, buffering=None, *, encoding=None, errors=None, newline=None):
返回与套接字关联的文件对象。返回的对象的具体类型取决于 makefile() 的参数。这些参数的解释方式与内置的 open() 函数相同,其中 mode 的值仅支持 ‘r’ (默认),‘w’ 和 ‘b’。
套接字必须处于阻塞模式,它可以有超时,但是如果发生超时,文件对象的内部缓冲区可能会以不一致的状态结尾。关闭 makefile() 返回的文件对象不会关闭原始套接字。

s.connect(address):
连接到 address 处的远程套接字。如果连接被信号中断,则本方法将等待,直到连接完成。如果信号处理程序未抛出异常,且套接字阻塞中或已超时,则在超时后抛出 socket.timeout。对于非阻塞套接字,如果连接被信号中断,则本方法将抛出 InterruptedError 异常(或信号处理程序抛出的异常)。 其中address是(host,port)形式的元组。例如:(“www.baidu.com”,80)。(一般套接字用作客户端时使用。)

>>> s.connect(('www.baidu.com',80))
>>> s
<socket.socket fd=880, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.1.107', 55470), raddr=('61.135.169.125', 80)>

s.bind(address):
将套接字绑定到 address。套接字必须尚未绑定。address同上。(套接字作为服务器时使用。)

s.accept():接受一个连接。调用此方法的socket对象必须绑定到一个地址上并且监听连接。返回值是一个 (conn, address) 对,其中 conn 是一个 新的套接字对象,用于在此连接上收发数据,address 是连接另一端的套接字所绑定的地址。(套接字作为服务器时使用。)

s.listen([backlog]):
启动一个作为服务器的套接字,用于接受连接(监听,方法名很直观)。如果指定 backlog,则它最低为 0(小于 0 会被置为 0),它指定系统允许暂未 accept 的连接数,超过后将拒绝新连接。未指定则自动设为合理的默认值。(套接字作为服务器时使用。)

s.recv(bufsize[, flags]):
从套接字接收数据。返回值是一个字节对象,表示接收到的数据。bufsize 指定一次接收的最大数据量。(注:为了最佳匹配硬件和网络的实际情况,bufsize 的值应为 2 的相对较小的幂,如 4096。)

s.recvfrom(bufsize[, flags]):
从套接字接收数据。返回值是一对 (bytes, address),其中 bytes 是字节对象,表示接收到的数据,address 是发送端套接字的地址。

s.send(bytes[, flags]):
发送数据给套接字。本套接字必须已连接到远程套接字。本方法返回已发送的字节数。应用程序要负责检查所有数据是否已发送,如果仅传输了部分数据,程序需要自行尝试传输其余数据。(有协议不同的因素,有的协议有时候发送的个数少于要发的字节长,一般要进行判断并重发,具体体经参考套接字编程指南。)

s.sendall(bytes[, flags]):
发送数据给套接字。本套接字必须已连接到远程套接字。与send() 不同,本方法持续从 bytes 发送数据,直到所有数据都已发送或发生错误为止。成功后会返回 None。出错后会抛出一个异常,此时并没有办法确定成功发送了多少数据。(各有优缺吧。)

s.sendto(bytes, flags, address):
发送数据给套接字。本套接字不应连接到远程套接字,而应由 address 指定目标套接字。返回发送字节数。

s.sendfile(file, offset=0, count=None):
使用高性能的 os.sendfile 发送文件,直到达到文件的 EOF 为止,返回已发送的字节总数。file 必须是一个以二进制模式打开的常规文件对象。如果指定了 count,它确定了要发送的字节总数。
s.shutdown(how):

关闭一半或全部的连接。如果 how 为 SHUT_RD,则后续不再允许接收。如果 how 为 SHUT_WR,则后续不再允许发送。如果 how 为 SHUT_RDWR,则后续的发送和接收都不允许。

s.getsockname():
返回一个元组:本机地址和端口。

>>> s.getsockname()
('192.168.1.107', 55470)

s.getpeername():
返回一个元组:远程机器的IP和端口。

>>> s.getpeername() 
('61.135.169.125', 80)

socket模块函数

socket.gethostbyname(host):
host是一个字符串的网址,返回解析之后的ip地址。

> >>> socket.gethostbyname("www.baidu.com") 
> '61.135.169.125'

socket.gethostname():
无参数,返回本机的主机名。

>>> socket.gethostname()
'HOST-TEST'  #已做处理

socket.gethostbyname_ex(hostname):
将主机名转换为 IPv4 地址格式的扩展接口。返回三元组 (hostname, aliaslist, ipaddrlist),其中 hostname 是响应给定 ip_address 的主要主机名,aliaslist 是相同地址的其他可用主机名的列表(可能为空),而 ipaddrlist 是 IPv4 地址列表,包含相同主机名、相同接口的不同地址(通常是一个地址,但不总是如此)。(一个ip可能对应多个域名,一个域名也可对应多个ip。)

> >>> socket.gethostbyname_ex
> ('www.baidu.com') ('www.a.shifen.com', ['www.baidu.com'], ['61.135.169.121', '61.135.169.125'])

返回三元组 (hostname, aliaslist, ipasocket.gethostbyaddr(ip_address)ddrlist),其中 hostname 是响应给定 ip_address 的主要主机名,aliaslist 是相同地址的其他可用主机名的列表(可能为空),而 ipaddrlist 是 IPv4/v6 地址列表,包含相同主机名、相同接口的不同地址(很可能仅包含一个地址)。

socket.getservbyname(servicename[, protocolname]):
将 Internet 服务名称和协议名称转换为该服务的端口号。protocolname(协议名称)可选的,如果提供的话应为 ‘tcp’ 或 ‘udp’,否则将匹配出所有协议。例如:”http”服务对应的端口就是80。

与之相对的就是:
socket.getservbyport(port[, protocolname]):
将 Internet 端口号和协议名称转换为该服务的服务名称。协议名称是可选的,如果提供的话应为 ‘tcp’ 或 ‘udp’,否则将匹配出所有协议。

模块自带错误

socket.error:
与I/O通信问题有关(连接有错误)。
socket.gaierror:
与地址查询有关(当主机名错误找不到地址时)。
socket.herror:
与其他地址错误有关。
socket.timeout:连接超时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值