`

python socket 模块API

 
阅读更多

此模块提供访问BSD套接字接口。 

一、底层网络接口

允许在现代modern Unix systems, Windows, Mac OS X, BeOS, OS/2与可能的其他平台上使用。(需要平台依赖)

套接地址表示:

 

     套接字地址表示如下:单个字符串用于AF_UNIX地址族。一对(主机,端口)是用于AF_INET地址类别,其中主机是一个字符串,代表互联网域名符号像'daring.cwi.nl的像'100.50.200.5'或IPv4地址中的主机名和端口一个整数。 

    对于IPv4地址,接受两个特殊的形式,而不是一个主机地址:空字符串表示INADDR_ANY和字符串<BROADCAST>'代表INADDR_BROADCAST的的。行为是不是为了向后兼容的IPv6,因此,你可能会想避免这些,如果你打算在你的Python程序支持IPv6。

    如果你使用一个主机名在IPv4/v6的套接字地址的主机部分中,程序会显示一个不确定的行为,Python使用DNS解析返回的第一个地址。不同的方式解决的套接字地址转换为实际的IPv4/v6地址,DNS解析或主机配置的结果而定。尽量在主机部分使用数字地址。

通过setblocking()方法支持非阻塞式模式。

通过setTimeout()方法支持普遍超时。

 

exception 

socket.error socket抛出系统异常。

socket.herror 引发与地址相关错误。C API中包括gethostbyname_ex()和gethostbyaddr()。

socket.gaierror 由getaddrinfo() and getnameinfo()引发的地址错误。

socket.timeout 由之前使用socket引发的超时异常

2.3新增

socket.AF_UNIX 
socket.AF_INET
socket.AF_INET6

这些常数代表地址(协议)的家庭,用于socket()的第一个参数。 AF_UNIX常量如果没有定义,那么这个协议是不支持的。

socket.SOCK_STREAM
socket.SOCK_DGRAM
socket.SOCK_RAW
socket.SOCK_RDM
socket.SOCK_SEQPACKET

这些常量表示套接字类型,第二个参数用于socket()。 (只有SOCK_STREAM和SOCK_DGRAM似乎是普遍有用的。)

SO_*
socket.SOMAXCONN
MSG_*
SOL_*
IPPROTO_*
IPPORT_*
INADDR_*
IP_*
IPV6_*
EAI_*
AI_*
NI_*
TCP_*

在unix文档中socket和ip端口中有很多如此的常量,普遍用在setsockopt()和getsockopt()方法中,在大多数情况中,这些unix头文件中被定义的符号已经作为默认值已经提供。

SIO_*
RCVALL_*

windows WSAIoctl()常量参数。

New in version 2.6.

TIPC_*

TIPC相关常量。匹配C socket API 输出。

socket.has_ipv6 

 

1
2
>>> socket.has_ipv6
True

表示支持IPV6.

 

socket.create_connection(address[, timeout[, source_address]])

连接到一个TCP服务监听网络地址address(host, port),并返回一个socket对象。这是一个比socket.connect()高级的函数:如果是非IP地址,会尝试连接所有解析到的域名。与此同时兼容IPV6/4使得对客户端编程更容易。

timeout,可选超时,如果长时间未连接成功,会在timeout时间重新连接。可以从getdefaulttimeout()获得默认超时时间。

 

1
2
s=socket.socket()
s.connect(('127.0.0.1',1234))

(地址,端口)作为address。

 

source_address 用法同address,如果不提供默认使用主机提供的。(2.7新增)

socket.getaddrinfo(host, port[, family[, socktype[, proto[, flags]]]])

取得该host(域名)的地址。返回值:(family, socktype, proto, canonname, sockaddr)

 

1
2
>>> socket.getaddrinfo('www.baidu.com',80,0,0,socket.SOL_TCP)
[(2, 1, 6, '', ('61.135.169.125', 80)), (2, 1, 6, '', ('61.135.169.105', 80))]

 

New in version 2.2.

 

socket.getfqdn([name])

返回一个完全合格的域名名称。如果名字被省略或为空,它被解释为本地主机。首先使用gethostbyaddr()找到合法的名称,其次是主机别名,最后使用gethostname()时返回的主机名。

 

socket.gethostbyname(hostname)

获取hostname(域名)的IP,不支持IPV6,getaddrinfo()支持IPV6.

 

1
2
>>> socket.gethostbyname('g.cn')
'203.208.46.211'

 

 

socket.gethostbyname_ex(hostname)

返回hostname的所有IP地址列表。

 

1
2
>>> socket.gethostbyname_ex('g.cn')
('g.cn', [], ['203.208.46.208', '203.208.46.209', '203.208.46.210', '203.208.46.212', '203.208.46.211'])

socket.gethostname()

获取当前主机名。可以通过gethostbyname(gethostname())获取当前IP

 

1
2
>>> socket.gethostname()
'mail.chen.com'<span style="font-size:9pt;line-height:1.5;"></span>
1
2
3
>>> from socket import *
>>> gethostbyname(gethostname())
'60.229.229.45'

 

socket.gethostbyaddr(ip_address)

由IP地址获取host名。

socket.getnameinfo(socketaddr, flags)

socket.getprotobyname(protocolname)

获取协议名的常数。比如(‘icmp’)

socket.getservbyname(servicename[protocolname])

由给出的服务名获得端口,比如‘sshd',protocllname是互联网协议名,比如’udp‘

socket.getservbyport(port[protocolname])

与上相反

socket.socket([family[type[proto]]])

由给出的参数建立socket

1
2
3
>>> s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
>>> socket.socket(socket.AF_INET,socket.SOCK_STREAM)
<socket._socketobject object at 0x10b0d5980>

socket.socketpair([family[type[proto]]])

同上,UNIX可用。 New in version 2.4.

socket.fromfd(fdfamilytype[proto])

从现有的文件描述符创建一个 socket 对象。UNIX可用

socket.inet_aton(ip_string)

用32位包装IP地址

socket.inet_ntoa(packed_ip)

转换32位IP地址

socket.getdefaulttimeout()

获得默认超时时间(秒)(浮点)

socket.setdefaulttimeout(timeout)

设置默认超时时间。初始化生成,未设置为无。

socket.SocketType

python类型对象,相当于type(socket(..))

另参考

Module SocketServer 网络服务简化模块
Module ssl 一个TLS / SSL套接字对象包装器。

二、Socket Objects 套接字对象

socket.accept()

接受连接。套接字必须绑定到一个地址,侦听连接。返回值是一对(conn,address),其中conn是一个新的socket对象可用来发送和接收数据连接上,地址是绑定的另一端连接到socket。

socket.bind(address)

把socket BIND到 address上。

socket.close()

关闭套接字。套接字对象的未来的操作将失败。远程端将收到不再有数据。套接字会自动关闭,当他们进行垃圾回收。调用shutdown() 之前 close().

socket.connect(address)

连接到远程的套接字。!这种方法一直以来接受一对参数AF_INET地址,而不是只有一个元组。

socket.connect_ex(address)

返回错误值,不抛出异常。例如在异步连接时可用。

socket.fileno()

返回套接字的文件描述符(一个小整数)。!Windows下的小整数返回这个方法不能使用,可以使用一个文件描述符(如os.fdopen())。Unix则无此限制。

socket.getpeername() ?

返回的套接字连接到的远程地址。这是非常有用的,找到的端口号,例如远程IPv4/v6的套接字。

socket.getsockname()

返回套接字的自己的地址。这是非常有用的,以查询的IPv4/v6的套接字的端口号

socket.getsockopt(leveloptname[buflen]) ?

获得指定 socket 选项的值

socket.ioctl(control, option)
平台:windoes

socket.listen(backlog)

监听连接的套接字

socket.listen(backlog)

积压参数指定的最大排队连接数应至少为0,最大值是取决于系统的(通常为5),最低值将被强制为0。

socket.makefile([mode[, bufsize]])

返回一个文件对象与套接字关联。 (File对象文件对象)的文件对象引用一个DUP()PED版本的套接字文件描述符,这样的文件对象和套接字对象可能被关闭或垃圾独立收集。套接字必须是阻塞模式(它不能有超时)。可选的模式和,BUFSIZE参数解释同样的方式通过内置的file()函数。

socket.recv(bufsize[, flags])

从套接字接收数据。返回值是一个字符串代表接收到的数据。最大数量的数据立即收到指定由bufsize。

socket.recvfrom(bufsize[, flags])

从套接字接收数据。返回值是一对(string,地址)返回字符串和地址。

socket.recvfrom_into(buffer[, nbytes[, flags]])

从socket接收数据,写入到缓冲区,而不是创建一个新的字符串。返回值是一对(nbytes,address)nbytes以收到的字节数和地址套接字的地址发送数据。

socket.recv_into(buffer[nbytes[flags]])

接收从套接字nBytes个字节,将数据存储到一个缓冲区,而不是创建一个新的字符串。 nbytes以未指定的(或0),接收可在给定的缓冲区的大小。返回接收的字节数。

socket.send(string[flags])

将数据发送到套接字。必须连接到远程套接字。

socket.sendall(string[flags])

继续发送。同上。

socket.sendto(stringaddress)

将数据发送到套接字。套接字不应该被连接到远程套接字。

socket.sendto(stringflagsaddress)

同上。

socket.setblocking(flag)

设置阻塞或非阻塞套接字模式:如果flag为0,套接字设置无阻塞,否则成阻塞模式。起初,所有的套接字都处于阻塞模式。在非阻塞模式,如果一个recv()调用没有找到任何数据,或者如果一个发送()调用不能立即处理的数据,错误引发异常;处于阻塞模式,调用块,直到他们可以继续进行。  s.setblocking(0)是相当于到s.settimeout(0.0); s.setblocking(1)是相当于s.settimeout的(无)。

socket.settimeout(value)

设置超时时间。

socket.gettimeout()

获得超时时间。

套接字的阻塞和超时的一些注意事项:一个Socket对象可以在三种模式之一:堵,非阻塞,或超时。总是创建套接字处于阻塞模式。在阻止模式下,操作块,直到完成系统会返回一个错误(如连接超时)。在非阻塞模式,操作失败(有一个错误,不幸的是,依赖系统),如果他们不能立即完成。在超时模式下,操作失败,如果他们不能完成指定的超时套接字内,或如果系统返回一个错误。 setblocking()方法简直是一定的setTimeout()调用的简写。
超时模式内部设置套接字非阻塞模式。阻塞和超时模式之间共享文件描述符和套接字对象引用到同一网络的端点。这样做的后果是,套接字处于阻塞模式时,只能用于文件的makefile()方法返回的对象;超时或非阻塞模式不能立即完成的文件操作将失败。
需要注意的是连接(),操作超时设置,一般建议调用setTimeout()调用connect()之前,或通过一个超时参数到create_connection()。系统网络协议栈可能返回连接超时自身的错误,不管任何Python套接字超时设置。
(google)

socket.setsockopt(leveloptnamevalue)

socket.shutdown(how)

关停半个或一个连接。

三、转载-简化socketAPI

表1. Python 类和模块

 

类/模块

说明

Socket

低层网络接口(每个 BSD API)

SocketServer

提供简化网络服务器开发的类

表2. Socket 模块的类方法

类方法

说明

Socket

低层网络接口(每个 BSD API)

socket.socket(family, type)

创建并返回一个新的 socket 对象

socket.getfqdn(name)

将使用点号分隔的 IP 地址字符串转换成一个完整的域名

socket.gethostbyname(hostname)

将主机名解析为一个使用点号分隔的 IP 地址字符串

socket.fromfd(fd, family, type)

从现有的文件描述符创建一个 socket 对象

 

表3. Socket 模块的实 例方法 

实例方法

说明

sock.bind( (adrs, port) )

将 socket 绑定到一个地址和端口上

sock.accept()

返回一个客户机 socket(带有客户机端的地址信息)

sock.listen(backlog)

将 socket 设置成监听模式,能够监听 backlog 外来的连接请求

sock.connect( (adrs, port) )

将 socket 连接到定义的主机和端口上

sock.recv( buflen[, flags] )

从 socket 中接收数据,最多 buflen 个字符

sock.recvfrom( buflen[, flags] )

从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号

sock.send( data[, flags] )

通过 socket 发送数据

sock.sendto( data[, flags], addr )

通过 socket 发送数据

sock.close()

关闭 socket

sock.getsockopt( lvl, optname )

获得指定 socket 选项的值

sock.setsockopt( lvl, optname, val )

设置指定 socket 选项的值


四、官方API例子

这里有四个最小的例子程序,使用TCP / IP协议的服务器相呼应它接收的所有数据

服务器必须执行的顺序socket,bind,listen,recv(可能重复recv()服务多个客户端),而客户端只需要顺序socket,connect.

first two examples support IPv4 only.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Echo server program
import socket
 
HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()
1
2
3
4
5
6
7
8
9
10
11
# Echo client program
import socket
 
HOST = 'daring.cwi.nl'    # The remote host
PORT = 50007              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
分享到:
评论

相关推荐

    使用 Python 进行 socket 编程

    使用 Python 进行 socket 编程,Python 提供了两个基本的 socket 模块。第一个是 Socket,它提供了标准的 BSD Sockets API。第二个是 SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。

    Python 中的 Socket 编程

    Socket API 概览 TCP Sockets 客户端 / 服务器echo 程序 echo 程序的服务端 echo 程序的客户端 运行echo 程序的客户端和服务端 查看 socket 状态 通信流程的分解 处理多个连接 多连接的客户端 / 服务器程序 多连接的...

    python socket编程详细介绍.docx

    Python 提供了两个基本的 socket 模块。 第一个是 Socket,它提供了标准的 BSD Sockets API。 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。...下面讲的是Socket模块功能

    Python程序设计:ipwhois模块与pprint模块.pptx

    Socket模块和Pprint模块 01 ONE 知识点:ipwhois模块 Ipwhois模块 查询域名 在Python中可以使用ipwhois第三方库来查询域名的详细信息,需要安装。 ipwhois模块是一个提供了获取和解析IPv4及IPv6地址的Whois信息。 ...

    Python示例-从基础到高手PDF

    第 8 章 python 调用 zabbix 的 api 接口添加主机、查询组、主机、模板 第 9 章 python+Django 实现 Nagios 自动化添加监控项目 第 10 章 通过 python 和 websocket 构建实时通信系统[扩展 saltstack 监控] 第 11...

    Python3 socket即时通讯脚本实现代码实例(threading多线程)

    低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。 ——...

    python 聊天客户端程序

    Python 提供了两个基本的 socket 模块。 第一个是 Socket,它提供了标准的 BSD Sockets API。 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

    Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程

    HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:...

    Python核心编程第二版

    很不错的python书 第1部分 Python核心  第1章 欢迎来到Python世界   1.1 什么是Python   1.2 起源   1.3 特点   1.3.1 高级   1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展   1.3.5 可...

    易语言-HP-Socket 5.5.1 rc2 源码+模块+例程

    HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 HPSocket v5.5.1 rc2 更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 增加可靠 UDP 示例 TestEcho-...

    Python核心编程第二版(ok)

    Python核心编程第二版(ok) 第1部分 Python核心  第1章 欢迎来到Python世界   1.1 什么是Python   1.2 起源   1.3 特点   1.3.1 高级   1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展   ...

    Python网络编程 Python套接字编程

    低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法。 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。 什么...

    易语言-Hp-Socket For E 5.3.2 高性能TCP/UDP通信组件 源码+模块+例程

    HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序中。 为了让使用者能方便快速地学习和使用 HP-Socket ,迅速掌握框架的设计思想和使用方法,特此精心制作了大量 Demo 示例(如:...

    python cookbook(第3版)

    15.5 从扩张模块中定义和导出C的API 15.6 从C语言中调用Python代码 15.7 从C扩展中释放全局锁 15.8 C和Python中的线程混用 15.9 用WSIG包装C代码 15.10 用Cython包装C代码 15.11 用Cython写高性能的数组操作 ...

    python入门到高级全栈工程师培训 第3期 附课件代码

    04 ORM查询API 05 模糊查询之万能的双下换线 第52章 01 上节知识回顾 02 ORM多表操作之一对多增加记录 03 ORM多表操作之一对多查询之对象查询 04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多...

Global site tag (gtag.js) - Google Analytics