版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、foundations of python network programming-阅读说明系列(1)-Low-Level Networking过去对如何将两台机器连接在一起很有热情,很多连接方式到今天已经过时,现在还有很多方法在使用。TCP/IP就是其中之一。换句话说,TCP/IP协议是当今使用最广泛的协议,本书的所有内容都基于TCP/IP。TCP/IP的数据传输层是TCP和UDP;如果通过TCP和UDP连接远程系统,则只需要远程系统的IP和端口号。然后建立连接以传输数据。TCP和UDP有多种不同之处。何时使用TCP?1.确保传输的数据准确到达并保持完整。2.比起简单的请求或返回,需要发送更
2、多的资料。能够承受建立连接所需的时间。(效率低下)何时使用UDP?1.我不在乎你送的包是否准确到达,或者你是否能亲自处理这种问题。(不稳定)但愿简单的请求和回归。需要快速连接。(高效)4.你发送的数据量不是很大。UDP不能超过每个数据包64KB,UDP通常仅用于小于1KB。在Python上建立一个TCP或UDP连接是非常简单的,必须使用Socket模块,即Python的标准模块。客户端(Network Clients)1.建立socket物件S=socket.socket (socket.af _ inet,socket.sock _ stream)第一个参数socket。AF_INET使用I
3、Pv4,第二个参数socket .SOCK_STREAM表示将TCP用于数据传输,而将UDP用于数据传输,则socket .使用SOCK_DGRAM。例如:S=socket.socket (socket.af _ inet,socket.sock _ dgram)2.连接远程服务器连接s . connect( www . ,80)连接远程服务器需要远程服务器的IP和端口。由于Python已验证DNS,因此您可以使用上面的服务器域名。您还可以看到connect的参数为tuple。连接到Http站点,默认端口为80,可以通过以下方式获取默认端口号:Port=socket.g
4、etservbyname (http,TCP)您可以查询Smtp、FTP等端口号。3.连接后从一个socket对象中获取信息例如,获取本机IP地址和端口号,获取远程系统的IP地址和端口号。例如:#!/usr/bin/env python# Information Example-Chapter 2Import socketprint“Creating socket”、S=socket.socket (socket.af _ inet,socket.sock _ stream)Print doneprint“Looking up port number”、Port=socket.getservb
5、yname (http,TCP)Print doneprint“connecting to remote host on port % d”% port、s . connect( www . G ,port)Print donePrint connected from ,s.getsockname()Print connected to ,s.getpeername()输出结果显示如下:Creating socket.done。Looking up port number.done。Connecting to remote host on port 80.done。连接自(1
6、92.168.xx.xx,2548)连接到(04,80)我的默认端口号是任意端口号(2548),每个执行端口号都不同。4.File-like对象您可以使用Socket对象执行传输(send()、sendto()、数据接收操作(recv()、recvfrom()等操作,还可以将Socket对象作为文件伪对象(File-like obfrom()File-like对象更适合TCP连接。TCP连接必须确保数据流完整、准确地到达,因为数据流的行为类似于单个文件。UDP不是。基于包的连接,仅发送包,因此使用File-like对象处理时,跟踪定位错误可能会很困难。通过以下语句创建F
7、ile-like对象:Fd=s.makefile(rw,0) #s是先前创建的socket对象,rw表示可读写权限然后可以调用FD的write()、readines()等方法。示例如下,还注意详细的错误处理,此处不详细说明。#!/usr/bin/env python# error handling example with shut down and file-like objects-chapter 2Import socket、sys、timeHost=sys.argv1Textport=sys.argv2Filename=sys.argv3Try:S=socket.socket (soc
8、ket.af _ inet,socket.sock _ stream)Except socket.error,e:print“strange error creating socket :% s”% eSys.exit(1)# try parsing it as a numeric port number。Try:Port=int(textport)Except ValueError:# that didnt work。lookit up instread。Try:port=socket . getservbyname(text port,TCP)Except socket.error,e:p
9、rint“could nt find your port :% s”% eSys.exit(1)Try:S.connect(host,port)Except socket.gaierror,e:print“address-related error connecting to server :% s”% eSys.exit(1)Except socket.error,e:print“connection error :% s”% eSys.exit(1)Fd=s.makefile(rw,0)print“sleeping”Time.sleep(10)print“Continuing”Try:FD
10、 . write(“get % s http/1.0 r n r n”% filename)Except socket.error,e:print“error sending data :% s”% eSys.exit(1)Try:Fd.flush()Except socket.error,e:print“error sending detected by flush”:% s“% eSys.exit(1)Try:S.shutdown(1)Except socket.error,e:print“error sending data(detected by shut down):% s”% eS
11、ys.exit(1)While 1:Try:Buf=fd.read(2048)Except socket.error,e:print error receiving data :% s % eSys.exit(1)If not len(buf):BreakSys.stdout.write(buf)在上面传输数据后,使用shutdown方法确保成功到达目标系统。这是因为shutdown()正在等待,直到收到正确的退出代码。服务器端(Network Server)使用TCP创建服务器可以概括为以下四个步骤:1.建立socket物件。(创建套接字对象)2.设定socket物件的属性。(设置选项)3.
12、绑定端口。(bind to a port)4.从客户端接收连接。(连接的清单)以上四个步骤中最简单的实现是:Host=#允许所有端口上的连接Port=51423#第一步是创建socket对象S=socket.socket (socket.af _ inet,socket.sock _ stream)#第二步,设置socket属性S.setsockopt (socket.sol _ socket,socket.so _ resuseaddr,1)步骤3,绑定端口S.bind(host,port)步骤4,接收客户端的连接S.listen(5) #参数5表示同时侦听5个连接通过UDP创建服务器的步骤
13、包括创建socket和设置option、bind端口,但UDP使用recvfrom()而不是listen()和accept()已足够。Recvfrom()函数返回两种信息:允许的数据(data)和客户端的地址(address)和端口(port)。以下是UDP服务器的示例:#!/usr/bin/env python# UDP echo server-chapter 3-udpehostserver . pyImport socket,tracebackHost=# Bind to all interfacesPort=51423S=socket.socket (socket.af _ inet,
14、socket.sock _ dgram)S.setsockopt (socket.sol _ socket,socket.so _ reuseaddr,1)S.bind(host,port)While 1:Try:Message,address=s.recvfrom (8192)Print Got data from ,address# Echo it backS.sendto(message,address)Except(系统退出):莱西Except:Traceback.print_exc()域名系统(Dns)我们可以很容易地记住博客gospeer的域名,但基本上很难说出IP地址,因为DNS
15、已经验证了域名。Socket.getaddrinfo()根据主机名或域名等获取相应的信息。Socket.getaddrinfo (host,port ,family ,sock type ,proto ,flags)。返回值是每个tuple返回以下信息的tuple列表:(系列、sock type、proto、canon name、sockaddr)同时,gethostbyddr()根据IP地址获取其信息,getaddrinfo()和gethostbyddr()可以对域名进行双重验证。例如:Import sys,socketDef getipaddrs(hostname):get a list of IP addresses from a givenhostname。this is a stand
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五金建材市场准入合同
- 2026年儿科人群临床试验中安慰剂使用的伦理与法规
- 广告投放项目合作协议范本
- 2026年数据安全能力成熟度模型应用
- 医疗AI算法合作合同协议2026
- 美甲美睫店员工薪酬福利合同
- 家电清洗服务合同范本协议范本
- 2026年展览馆特装展位结构安全与稳定性验算
- 肺癌中医护理的食疗方剂
- 2026年手术分级管理与授权程序
- 长期照护师(初级)理论考试题库(含答案及解析)
- 2026年国家保安员考试题库带答案(完整版)
- 2026中国热成型塑料材料行业竞争态势与供需前景预测报告
- 公文写作培训课件
- 矿山雨季生产安全知识培训
- 《生态环境监测安全风险识别与管控指南标准》(征求意见稿)
- 成套设备日常巡检与点检作业手册
- 2026甘肃新盛国资管理运营公司校招面试题及答案
- 2025科技部直属事业单位招聘67人(公共基础知识)综合能力测试题带答案解析
- 小学校园网络安全法课件
- 2025陕西西安航空制动科技有限公司招聘10人笔试历年常考点试题专练附带答案详解试卷2套
评论
0/150
提交评论