您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 使用Python进行socket编程
使用Python进行socket编程体验Python下面我们先对Python是什么建立一个直观印象。作为一种解释性语言,Python很容易使用,并且能够快速验证我们的想法和开发原型软件。Python程序可以作为一个整体进行解释,也可以一行行地解释。可以在第一次运行Python时测试一下下面的Python代码,然后一次只输入一行试试。在Python启动之后,会显示一个提示符(),可以在这里输入命令。注意在Python中,缩进非常重要,因此代码前面的空格不能忽略:清单1.可以试验的几个Python例子#Openafile,readeachline,andprintitoutforlineinopen('file.txt'):printline#Createafileandwritetoitfile=open(test.txt,w)file.write(testline\n)file.close()#Createasmalldictionaryofnamesandagesandmanipulatefamily={'Megan':13,'Elise':8,'Marc':6}#resultsin8family['Elise']#Removethekey/valuepairdelfamily['Elise']#Createalistandafunctionthatdoublesitsinput.Mapthe#functiontoeachoftheelementsofthelist(creatinganew#listasaresult).arr=[1,2,3,4,5]defdouble(x):returnx*xmap(double,arr)#Createaclass,inheritbyanother,andtheninstantiateitand#invokeitsmethods.classSimple:def__init__(self,name):self.name=namedefhello(self):printself.name+sayshi.classSimple2(Simple):defgoodbye(self):printself.name+saysgoodbye.me=Simple2(Tim)me.hello()me.goodbye()为什么使用Python?我们要学习和使用Python的一个原因是它非常流行。Python用户的数量以及使用Python编写的应用程序的不断增长使这种努力是值得的。在很多开发领域中都可以看到Python的踪迹,它被用来构建系统工具,用作程序集成的黏合剂,用来开发Internet应用程序和快速开发原型。Python与其他脚本语言相比也有一定的优势。它的语法非常简单,概念非常清晰,这使得Python非常容易学习。在使用复杂的数据结构(例如列表、词典和元组)时,Python也非常简单,而且可描述性更好。Python还可以对语言进行扩充,也可以由其他语言进行扩充。我发现Python的语法使它比Perl的可读性和可维护性更好,但是比Ruby要差。与Ruby相比,Python的优点在于它有大量的库和模块可以使用。使用这些库和模块,只需要很少的代码就可以开发功能丰富的程序。Python使用缩进格式来判断代码的作用域,这有些讨厌,但是Python本身的简单性使这个问题已经微不足道了。现在,让我们开始进入Python中的socket编程世界。Pythonsocket模块基本的Pythonsocket模块Python提供了两个基本的socket模块。第一个是Socket,它提供了标准的BSDSocketsAPI。第二个是SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。Python使用一种异步的方式来实现这种功能,您可以提供一些插件类来处理服务器中应用程序特有的任务。表1列出了本节所涉及的类和模块。表1.Python类和模块类/模块说明Socket低层网络接口(每个BSDAPI)SocketServer提供简化网络服务器开发的类让我们来看一下这些模块,以便理解它们是如何工作的。Socket模块Socket模块提供了UNIX®程序员所熟悉的基本网络服务(也称为BSDAPI)。这个模块中提供了在构建socket服务器和客户机时所需要的所有功能。这个API与标准的CAPI之间的区别在于它是面向对象的。在C中,socket描述符是从socket调用中获得的,然后会作为一个参数传递给BSDAPI函数。在Python中,socket方法会向应用socket方法的对象返回一个socket对象。表2给出了几个类方法,表3显示了一部分实例方法。表2.Socket模块的类方法类方法说明Socket低层网络接口(每个BSDAPI)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()关闭socketsock.getsockopt(lvl,optname)获得指定socket选项的值sock.setsockopt(lvl,optname,val)设置指定socket选项的值类方法和实例方法之间的区别在于,实例方法需要有一个socket实例(从socket返回)才能执行,而类方法则不需要。SocketServer模块SocketServer模块是一个十分有用的模块,它可以简化socket服务器的开发。有关这个模块的使用的讨论已经远远超出了本教程的范围,但是我将展示一下它的基本用法,然后您可以参阅参考资料一节中给出的链接。考虑清单2中给出的例子。此处,我们实现了一个简单的“HelloWorld”服务器,当客户机连接它时,它就会显示这样一条消息。我首先创建一个请求处理程序,它继承了SocketServer.StreamRequestHandler类。我们定义了一个名为handle的方法,它处理服务器的请求。服务器所做的每件事情都必须在这个函数的上下文中进行处理(最后,关闭这个socket)。这个过程的工作方式非常简单,但是您可以使用这个类来实现一个简单的HTTP服务器。在handle方法中,我们打一个招呼就退出了。现在连接处理程序已经准备就绪了,剩下的工作是创建socket服务器。我们使用了SocketServer.TCPServer类,并提供了地址和端口号(要将服务器绑定到哪个端口上)以及请求处理方法。结果是一个TCPServer对象。调用serve_forever方法启动服务器,并使其对这个连接可用。清单2.用SocketServer模块实现一个简单的服务器importSocketServerclasshwRequestHandler(SocketServer.StreamRequestHandler):defhandle(self):self.wfile.write(HelloWorld!\n)server=SocketServer.TCPServer((,2525),hwRequestHandler)server.serve_forever()就是这样!Python允许这种机制的任何变种,包括UDPServers以及派生进程和线程的服务器。请参阅参考资料一节中更多信息的链接。在所有具有socket的语言中,socket都是相同的——这是两个应用程序彼此进行通信的管道。前提条件不管是使用Python、Perl、Ruby、Scheme还是其他有用的语言(此处有用的意思是这种语言有socket接口)来编写socket程序,socket通常都是相同的。这是两个应用程序彼此进行通信的管道(这两个应用程序可以在同一台机器上,也可以位于两台不同的机器上)。使用Python这种具有socket编程功能的语言的区别在于,它有一些辅助的类和方法,可以简化socket编程。在本节中,我们将展示Python的socketAPI。可以使用一个脚本来执行Python的解释器,如果您要自己执行Python,就可以一次只输入一行代码。这样,就可以看到每个方法调用之后的结果了。下面这个例子展示了如何与Python解释器进行交互。此处我们使用了socket类方法gethostbyname将一个完整的域名()解析成一个使用点号分隔的IP地址字符串('129.42.19.99'):清单3.从解释器命令行中使用socket[camus]$pythonPython2.4(#1,Feb202005,11:25:45)[GCC3.2.220030222(RedHatLinux3.2.2-5)]onlinux2Typehelp,copyright,creditsorlicenseformoreinformation.importsocketsocket.gethostbyname(')'129.42.19.99'在导入socket模块之后,我调用了gethostbyname类方法将这个域名解析成IP地址。现在,我们要讨论基本的socket方法,并通过socket进行通信。您应该熟悉Python解释器。创建和销毁socket要新创建一个socket,可以使用socket类的socket方法。这是一个类方法,因为还没有得到可以应用方法的socket对象。socket方法与BSDAPI类似,下面是创建流(TCP)socket和数据报(UDP)socket的方法:清单4.创建流和数据报socketstreamSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)dgramSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)在这种情况中,会返回一个socket对象。AF_INET符号(第一个参数)说明您正在请求的是一个Internet协议(IP)socket,具体来说是IPv4。第二个参数是传输协议的类型(SOCK_STREAM对应TCPsocket,SOCK_DGRAM对应UDPsocket)。如果底层操作系统支持IPv6,那么还可以指定socket.AF_INET6来创建一个IPv6socket。要关闭一个已经连接的socket,可以使用close方法:streamSock.close()最后,可以使用del语句删除一个socket:delstreamSock这个语句可以永久地删除socket对象。之后再试图引用这个对象就会产生错误。Socket地址socket地址是一个组合,包括一个接口地址和一个端口号。由于Python可以很简单地表示元组,因此地址和端口也可
本文标题:使用Python进行socket编程
链接地址:https://www.777doc.com/doc-1281976 .html