此模块提供访问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(fd, family, type[, 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(level, optname[, 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(string, address)
将数据发送到套接字。套接字不应该被连接到远程套接字。
socket.sendto(string, flags, address)
同上。
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(level, optname, value)
socket.shutdown(how)
关停半个或一个连接。
三、转载-简化socketAPI
表1. Python 类和模块
类/模块 |
说明 |
Socket |
低层网络接口(每个 BSD API) |
提供简化网络服务器开发的类 |
表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模块是进行网络通信的基础,它提供了一种低级别的、原始的TCP/IP套接字接口。在本示例中,“python-socket.zip”包含了一个实现简单天气查询和电话归属地查询的服务端与客户端应用。这个应用展示了...
在Python中,socket模块主要用于实现进程间的网络通信,它基于BSD UNIX的socket API,使得开发者可以方便地处理IP地址和端口号,实现不同计算机或同一计算机内不同进程间的通信。 首先,我们创建一个socket对象,...
Python的socket模块为开发者提供了访问socket API的接口。通过使用socket,开发者可以编写客户端程序和服务器程序,用于各种网络通信场景,比如网页浏览、电子邮件传输、远程文件共享等。 在高级特性方面,Python...
在Python编程语言中,`socket`模块是进行网络...以上就是使用Python的socket模块实现服务端和客户端之间网络通信的基本原理和关键步骤。实际应用中,还需要根据具体需求进行错误处理、异常捕获以及更复杂的逻辑设计。
#### 1.2 Python Socket模块基本用法 - **创建Socket对象**:使用`socket.socket()`函数创建一个Socket对象。 ```python import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 其中`AF...
1. **Python Socket库**:Python的socket库是进行网络编程的基础,它提供了标准的BSD Sockets API。开发者可以使用socket库创建TCP/IP、UDP/IP等不同类型的网络连接。 2. **SOCKET5协议**:SOCKET5协议是一种代理...
首先,Python的Socket库提供了低级网络通信接口,它基于Berkeley Sockets API,允许开发者创建网络应用。要使用Socket,我们需要导入`socket`模块: ```python import socket ``` **Socket对象创建与绑定** 在...
Python的socket模块提供了一套简单的API来实现网络通信,允许程序员创建客户端和服务器应用程序。本文将详细介绍如何在Python中使用socket模块进行网络编程,包括创建套接字、连接服务、数据传输和错误处理。 通过...
6. **网络编程**:如socket模块,用于创建网络连接,实现客户端和服务器通信。 7. **异常处理**:详细介绍了Python的错误和异常处理机制,如何抛出和捕获异常,以及使用try/except/finally语句进行错误处理。 8. *...
它还可能展示不同网络模块如何在不同的网络操作中发挥作用,如`socket`用于基础连接,`urllib`处理HTTP请求,而`requests`提供更友好的API。 总之,这个"python各模块思维导图"是一个强大的学习工具,它将Python的...
使用 Python 进行 socket 编程,Python 提供了两个基本的 socket 模块。第一个是 Socket,它提供了标准的 BSD Sockets API。第二个是 SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。
Socket API 概览 TCP Sockets 客户端 / 服务器echo 程序 echo 程序的服务端 echo 程序的客户端 运行echo 程序的客户端和服务端 查看 socket 状态 通信流程的分解 处理多个连接 多连接的客户端 / 服务器程序 多连接的...
Socket模块遵循标准的BSD Sockets API,适合进行基本的网络通信,而SocketServer模块则通过提供服务器端的基类,简化了网络服务器的实现。 首先,我们来看Socket模块。创建Socket对象的基本语法是`socket(family, ...
9. **网络编程**:socket模块用于实现低级别的TCP/IP和UDP套接字编程,urllib模块处理URL相关的任务,如打开和下载网页。 10. **多线程与多进程**:threading模块提供了线程支持,multiprocessing模块用于多进程...
在IT领域,网络通信是不可或缺的一部分,而Python的socket模块为开发者提供了实现这一功能的工具。本文将深入探讨如何利用Python的socket模块构建一个简单的聊天系统,包括客户端和服务器端的交互过程,以及处理...
在服务器端,Python的`socket`模块用于创建和管理套接字,这些套接字可以接收来自客户端的数据。在这种情况下,客户端可能是摄像头或其他发送图像数据的设备。一旦接收到图像数据,服务器会将数据传递给YOLOv3模型...
传统的解决方案可能包括使用Flask等Web框架和Python的socket模块分别实现Web和Socket服务器,然后通过线程进行交互。但使用Tornado,我们可以直接在一个程序中集成这两者,减少复杂性和潜在的同步问题。 2. **环境...
4. socket模块的使用 文件提到了`socket.socket(family, type)`用于创建socket,以及多种socket方法,包括`bind`用于绑定地址到socket,`listen`用于监听连接,`accept`用于接受新的连接,`connect`用于建立连接,`...
在Python中,我们可以使用内置的socket模块创建和操作socket对象。Socket可以用于TCP(面向连接)或UDP(无连接)通信,这里我们关注的是TCP Socket,因为它更适合需要保持连接的WebSocket。 3. 浏览器到Socket的...