当前位置:编程学习 > python >>

python模块介绍- socket(1)

python模块介绍- socket
2013-03-11 磁针石
 
#承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 博客:http://blog.csdn.net/oychw
#版权所有,转载刊登请来函联系
# 深圳测试自动化python项目接单群113938272深圳会计软件测试兼职 6089740
#深圳地摊群 66250781武冈洞口城步新宁乡情群49494279
#自动化测试和python群组: http://groups.google.com/group/automation_testing_python
#参考资料:《The PythonStandard Library by Example 2011》
#http://docs.python.org/2/howto/sockets.html
 
底层的socket库可以直接访问本地Csocket库并且可与任何网络服务通信。select同时监控多个sockets,支持网络服务和多个客户端通信。
 
 
SocketServer框架抽象了很多创建网络服务器的重复工作。该类来可以使用fork或者线程创建服务器,支持TCP或UDP,用户只需要处理应用实际的消息处理。
 
asyncore实现了一个基于回调API的异步网络栈。它封装了轮询循环和缓冲,当接收数据时调用相应的处理程序。asynchat框架在asyncore的基础上简化了创建的双向基于消息协议的过程。
 
socket模块展示了使用BSD socketAPI在网络上进行通信的低级的C API。它包括用于处理实际数据信道socket类,还包括用于与网络相关的任务的功能,比如转换一个服务器的名字为地址和格式化要发送的数据
 
11.1 socket– 网络通信
套接字是程序使用通信信道用来本地或网络上来回传送数据的一个端点。套接字有两个基本属性用来控制发送数据:地址族控制的OSI网络层使用的协议,套接字类型控制输送层协议。
Python支持的3种地址族。最常见的AF_INET,用于IPv4的互联网寻址。几乎目前所有互联网联网使用IP版本4。
AF_INET6用于IPv6互联网寻址。IPv6是“下一代”版本的互联网协议。它支持128位的地址,流量控制和IPv4不支持的路由功能。IPv6有限使用,但持续增长。
AF_UNIX是UNIX域套接字(UDS),是POSIX兼容的系统上进程间的通信协议。UDS的实现通常允许操作系统不用通过网络堆栈在进程间直接通信。这比使用AF_INET更高效,但使用文件系统被作为命名空间进行寻址,UDS限制在同一系统。吸引力在于在IPC使用UDS,比如命名管道或共享内存的编程接口和IP网络一致。这应用程序可以使用网络通信同样的代码在单机上实现有效的通信机制。
 
套接字类型通常是为SOCK_DGRAM用户数据报协议(UDP)或SOCK_STREAM传输控制协议(TCP)。 tcp一般用户传送大量数据,udp一般用于传送少量数据或者多播。
Socket展示了使用BSDsocket接口进行网络通信的低层CAPI。它包括socket类,用于处理实际数据通道,还包含网络相关的功能,比如转换服务器名为地址,格式化要发送的数据。
11.1.1 寻址、协议家族和socket类型
 
套接字是程序在本地或者跨因特网来回传递数据的通信通道的端点。Socket有两个控制发送数据的基本属性:addressfamil控制使用OSI网络层协议,sockettype控制传输层协议。
Python支持三种地址家族。最常见的AF_INET用于IPv4的互联网寻址。 IPv4地址是4个字节长,为四个数字,以点分隔(例如,10.1.1.5和127.0.0.1),这些值通常称为“IP地址。”几乎目前所有的互联网网络是使用IPv4。
              AF_INET6是用于IPv6互联网寻址。 IPv6是“下一代”版本在Internet协议,采用128位的地址,它支持IPv4下不支持的流量整形和路由功能。IPv6使用依然有限的,但继续增长。
              AF_UNIX是UNIX域套接字(UDSUNIXDomain Sockets),是POSIX兼容的系统进程交互的通信协议。它常允许操作系统在进程间传递数据,无需通过网络栈,这是比使用POSIX兼容的系统进行更有效率。由于使用了文件系统作为namespace来寻址,UDS
限制在同一系统上的进程。建议在其他的IPC机制上使用UDS,如命名管道或共享内存机制,这样编程接口就和IP网络相同。这意味着应用程序本地可以有效的通信,且使用相同的代码可在网络上发送数据。
套接字是程序使用通信信道用来本地或网络上来回传送数据的一个端点。套接字有两个基本属性用来控制
发送数据:地址族控制的OSI网络层使用的协议,套接字类型控制输送层协议。
Python支持的3种地址族。最常见的AF_INET,用于IPv4的互联网寻址。几乎目前所有互联网联网使用IP版本4。
AF_INET6用于IPv6互联网寻址。 IPv6是“下一代”版本的互联网协议。它支持128位的地址,流量控制和IPv4不支持的路由功能。IPv6有限使用,但继续
增长。
AF_UNIX是UNIX域套接字(UDS),是POSIX兼容的系统上进程间的通信协议。UDS的实现通常允许操作系统不用通过网络堆栈在进程间直接通信。这比使用AF_INET更高效,但使用文件系统被作为命名空间进行寻址,UDS限制在同一系统。吸引力在于在IPC使用UDS,比如命名管道或共享内存的编程接口和IP网络一致。这应用程序可以使用网络通信同样的代码在单机上实现有效的通信机制。
套接字类型通常是为SOCK_DGRAM用户数据报协议(UDP)或SOCK_STREAM传输控制协议(TCP)。 tcp一般用户传送大量数据,udp一般用于传送少量数据或者多播。
11.1.1.1查找主机:
socket.gethostbyname(hostname)
翻译的主机名IPv4地址格式。以字符串形式返回的IPv4地址,如'100.50.200.5“。如果是一个IPv4地址的主机名,它原封不动地返回。更完整的接口参见gethostbyname_ex()。gethostbyname()的不支持IPv6名称解析,可以使用getaddrinfo()获取IPv4/v6双协议栈支持。
 
   import socket
   for host in [ ’homer’, ’www’, ’www.python.org’, ’nosuchname’ ]:
   try:
       print ’%s : %s’ % (host, socket.gethostbyname(host))
   except socket.error, msg:
       print ’%s : %s’ % (host, msg)
   
   执行结果:
   # python socket_gethostbyname.py
   homer : [Errno -2] Name or service not known
   www : [Errno -2] Name or service not known
   www.python.org : 82.94.164.162
   nosuchname : [Errno -2] Name or service not known   
 
socket.gethostbyname_ex(hostname)
翻译的主机名IPv4地址格式的扩展接口。返回一个三元组(hostname,aliaslist,ipaddrlist),gethostbyname_ex()不支持IPv6名称解析,可以使用getaddrinfo()获取IPv4/v6双协议栈支持。
   import socket
 
   for host in [ 'homer', 'www', 'www.python.org', 'nosuchname' ]:
       print host
       try:
            hostname, aliases, addresses =socket.gethostbyname_ex(host)
            print '  Hostname:', hostname
            print '  Aliases :', aliases
            print ' Addresses:', addresses
       except socket.error as msg:
            print 'ERROR:', msg
       print
       
   执行结果:
   # python socket_gethostbyname_ex.py
   homer
   ERROR: [Errno -2] Name or service not known
 
   www
   ERROR: [Errno -2] Name or service not known
 
   www.python.org
     Hostname: www.python.org
     Aliases : []
    Addresses: ['82.94.164.162']
 
   nosuchname
   ERROR: [Errno -2] Name or service not known
   
socket.getfqdn([name])
   返回一个完全的域名。如果名字被省略或为空,默认为本地主机。首先使用gethostbyaddr()返回的主机名来查找名称,然后是主机的别名。被选中的第一名称,其中包括一个时期。如果没有完全合格的域名,返回的gethostname()返回的主机名。   
 
   import socket
补充:Web开发 , Python ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,