免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1611 | 回复: 0
打印 上一主题 下一主题

python网络编程(-) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-15 18:14 |只看该作者 |倒序浏览
一、网络知识的一些介绍
socket是网络连接端点。例如当你的Web浏览器请求www.pythontik.com上的主页时,你的Web浏览器创建一个socket并命令它去连接www.pythontik.com的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听。两端使用各自的socket来发送和接收信息。
在使用的时候,每个socket都被绑定到一个特定的IP地址和端口。IP地址是一个由4个数组成的序列,这4个数均是范围0~255中的值(例如,220,176,36,76);端口数值的取值范围是0~65535。端口数小于1024的都是为众所周知的网络服务所保留的(例如Web服务使用的80端口);最大的保留数被存储在socket模块的IPPORT_RESERVED变量中。你也可以为你的程序使用另外的端口数值。
不是所有的IP地址都对世界的其它地方可见。实际上,一些是专门为那些非公共的地址所保留的(比如形如192.168.y.z或10.x.y.z)。地址127.0.0.1是本机地址;它始终指向当前的计算机。程序可以使用这个地址来连接运行在同一计算机上的其它程序。
IP地址不好记,你可以花点钱为特定的IP地址注册一个主机名或域名(比如使用www.pythontik.com代替222.76.216.16)。域名服务器(DNS)处理名字到IP地址的映射。每个计算机都可以有一个主机名,即使它没有在官方注册。
多少信息通过一个网络被传送基于许多因素,其中之一就是使用的协议。许多的协议是基于简单的、低级协议以形成一个协议栈。例如HTTP协议,它是用在Web浏览器与Web服务器之间通信的协议,它是基于TCP协议,而TCP协议又基于IP协议。
当在你自己的两个程序间传送信息的时候,你通常选择TCP或UDP协议。TCP协议在两端间建立一个持续的连接,并且你所发送的信息有保证的按顺序到达它们的目的地。UDP不建立连接,它的速度快但不可靠。你发送的信息也可能到不了另一端;或它们没有按顺序到达。有时候一个信息的多个复制到达接收端,即使你只发送了一次。
二、使用地址和主机名
socket模块提供了几个函数用于使用主机名和地址来工作。
gethostname()返回运行程序所在的计算机的主机名:
>>> import socket
>>> socket.gethostname()
'lenovo'

gethostbyname(name)尝试将给定的主机名解释为一个IP地址。首先将检查当前计算机是否能够解释。如果不能,一个解释请求将发送给一个远程的DNS服务器(远程的DNS服务器还可能将解释请求转发给另一个DNS服务器,直到该请求可以被处理)。gethostbyname函数返回这个IP地址或在查找失败后引发一个异常。
>>> socket.gethostbyname('lenovo')
'192.168.1.4'
>>> socket.gethostbyname('www.pythontik.com')
'222.76.216.16'

一个扩展的形式是gethostbyname_ex(name),它返回一个包含三个元素的元组,分别是给定地址的主要的主机名、同一IP地址的可选的主机名的一个列表、关于同一主机的同一接口的其它IP地址的一个列表(列表可能都是空的)。
>>> socket.gethostbyname('www.163.com')
'60.191.81.49'
>>> socket.gethostbyname_ex('www.163.com')
('www.cache.split.netease.com', ['www.163.com'], ['60.191.81.48', '60.191.81.49
, '60.191.81.50', '60.191.81.51', '60.191.81.52', '60.191.81.53', '60.191.81.54
, '220.181.28.50', '220.181.28.51', '220.181.28.52', '220.181.28.53', '220.181.
8.54', '220.181.31.182', '220.181.31.183', '220.181.31.184'])

gethostbyaddr(address)函数的作用与gethostbyname_ex相同,只是你提供给它的参数是一个IP地址字符串:
>>> socket.gethostbyaddr('202.165.102.205')
('homepage.vip.cnb.yahoo.com', ['www.yahoo.com.cn'], ['202.165.102.205'])

getservbyname(service,protocol)函数要求一个服务名(如'telnet'或'ftp')和一个协议(如'tcp'或'udp'),返回服务所使用的端口号:
>>>socket.getservbyname('http','tcp')
80
>>>socket.getservbyname('telnet','tcp)
23

通常,非Python程序以32位字节包的形式存储和使用IP地址。inet_aton(ip_addr)和inet_ntoa(packed)函数在这个形式和IP地址间作转换:
>>> socket.inet_aton('222.76.216.16')
'\xdeL\xd8\x10'
>>> socket.inet_ntoa('\xdeL\xd8\x10')
'222.76.216.16'

socket也定义了一些变量来代表保留的IP地址。INADDR_ANY和INADDR_BROADCAST是被保留的IP地址分别代表任意IP地址和广播地址;INADDR_LOOPBACK代表loopback设备,总是地址127.0.0.1。这些变量是32位字节数字形式的。
getfqdn([name])函数返回关于给定主机名的全域名(如果省略,则返回本机的全域名)。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/59571/showart_1901035.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP