• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >python > Python 网络编程说明第1/2页

Python 网络编程说明第1/2页

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了python网络编程,python网络编程基础,python网络编程 第3版,python网络编程实例,python网络编程攻略等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、网络知识的一些介绍

socket 是网络连接端点。例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的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.jb51.net代替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.jb51.net')
'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])函数返回关于给定主机名的全域名(如果省略,则返回本机的全域名)。

三、使用低级的socket通信

尽管Python提供了一些封装,使得使用socket更容易,但是你也可以直接使用socket来工作。

1、创建和销毁socket

socket 模块中的socket(family,type[,proto])函数创建一个新的socket对象。family的取值通常是AF_INET。type 的取值通常是SOCK_STREAM(用于定向的连接,可靠的TCP连接)或SOCK_DGRAM(用于UDP):

>>> from socket import *
>>> s=socket(AF_INET,SOCK_STREAM)

family和type参数暗指了一个协议,但是你可以使用socket的第三个可选的参数(proto的取值如IPPROTO_TCP或IPPROTO_RAW)来指定所使用的协议。代替使用IPPROTO_XX变量,你可以使用函数getprotobyname:

>>> getprotobyname('tcp')
6
>>> IPPROTO_TCP
6

fromfd(fd,type[,proto]) 是一个很少被使用的函数,它用来从打开的一个文件描述符创建一个socket对象(文件描述符由文件的fileno()方法返回)。文件描述符与一个真实 的socket连接,而非一个文件。socket对象的fileno()方法返回关于这个socket的文件描述符。

当你使用完工 socket对象时,你应调用close()方法显式的关闭socket以尽快释放资源(尽管socket被垃圾回收器回收时将自动被关闭)。另外,你也 可以使用shutdown(how)方法来关闭连接一边或两边。参数0阻止socket接收数据,1阻止发送,2阻止接收和发送。

2、连接socket

当 两个socket连接时(例如使用TCP),一端监听和接收进来的连接,而另一端发起连接。临听端创建一个socket,调用bind(address) 函数去绑定一个特定的地址和端口,调用listen(backlog)来临听进来的连接,最后调用accept()来接收这个新的,进来的连接,下面是在 服务器端的代码:

>>> s=socket(AF_INET,SOCK_STREAM)
>>> s.bind(('127.0.0.1',44444))
>>> s.listen(1)
>>> q,v=s.accept() #返回socket q和地址v

注意:上面的代码将一直处于等待直到连接被建立。下面我们再打开另一个Python解释器,用作客户端;然后键入如下代码:
>>> from socket import *
>>> s=socket(AF_INET,SOCK_STREAM)
>>> s.connect(('127.0.0.1',44444) #发起连接

好了,我们验证一下连接是否建立了。我们在服务器端键入以下代码来发送一条信息:

>>> q.send('hello,i come from pythontik.com') 注:有时可能出现send() argument 1 must be string or buffer,not str 错误,原因可能是您的机器不支持UTF-8字符集,临时解决方案是q.send(b' hello...')
31 #发送的字节数

在客户端键入以下代码来接收信息:
>>> s.recv(1024)
'hello,i come from pythontik.com'

你 传递给bind和connect的地址是一个关于AF_INET的socket的元组(ipAddress,port)。代替connect,你也可以调 用connect_ex(address)方法。如果背后对C的connect的调用返回一个错误,那么connect_ex也将返回一个错误(否则返回 0代表成功),代替引发一个异常。

当你调用listen时,你给了它一个参数,这个数值表示在等待队列中允许放置的进来的连接总数。当等待队列已满时,如果有更多的连接到达,那么远程端将被告知连接被拒绝。在socket模块中的SOMAXCONN变量表明了等待队列所能容纳的最大量。

accept()方法返回形如bind和connect的一个地址,代表远程socket的地址。下面显示变量v的值:

>>> v
('127.0.0.1', 1334)

UDP是不定向的连接,但是你仍然可以使用给定的目的地址和端口来调用connect去关联一个socket。

3、发送和接收数据

函 数send(string[,flags])发送给定的字符串到远程socket。sendto(string[,flags],address)发送给 定的字符串到一个特定的地址。通常,send方法用于可靠连接的socket,sendto方法用于不可靠连接的socket,但是如果你在一个 UDP socket上调用connect来使它与一个特定的目标建立联系,那么这时你也可以使用send方法来代替sendto。

send和sendto都返回实际发送的字节数。当你快速发送大量的数据的时候,你可能想去确保全部信息已被发送,那么你可以使用如下的一个函数:

def safeSend(sock,msg):
sent=0
while msg:
i=sock.send(msg)
if i==-1: #发生了错误
return -1
sent+=i
msg=msg[i:]
time.sleep(25)
return sent

recv(bufsize[,flags]) 方法接收一个进来的消息。如果有大量的数据在等待,它只返回前面的bufsize字节数的数据。recvfrom(bufsize[,flags])做同 样的事,除了它使用AF_INET socket的返回值是(data,(ipAddress,port)),这便于你知道消息来自哪儿(这对于非连接的 socket是有用的)。

send,sendto,recv和recvfrom方法都

您可能想查找下面的文章:

  • python 网络编程常用代码段
  • python从网络读取图片并直接进行处理的方法
  • python网络编程之文件下载实例分析
  • python网络编程之读取网站根目录实例
  • Python中的并发编程实例
  • Python中的并发编程实例
  • python网络编程学习笔记(10):webpy框架
  • python网络编程学习笔记(九):数据库客户端 DB-API
  • python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
  • python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)

相关文章

  • Python基于pillow判断图片完整性的方法
  • 在centos7中分布式部署pyspider
  • Python中shutil模块的常用文件操作函数用法示例
  • Python 常用的安装Module方式汇总
  • windows及linux环境下永久修改pip镜像源的方法
  • python益智游戏计算汉诺塔问题示例
  • python使用reportlab画图示例(含中文汉字)
  • 解决Python 遍历字典时删除元素报异常的问题
  • python制作爬虫爬取京东商品评论教程
  • Python def函数的定义、使用及参数传递实现代码

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • python实现哈希表
    • python处理html转义字符的方法详解
    • SQLite3中文编码 Python的实现
    • Python实现的下载8000首儿歌的代码分享
    • 在Python中处理字符串之isdecimal()方法的使用
    • Python中列表(list)操作方法汇总
    • python中enumerate的用法实例解析
    • 深入解析Python中的变量和赋值运算符
    • python 把数据 json格式输出的实例代码
    • Python中threading模块join函数用法实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有