Python笔记之网络编程

来源:互联网 发布:红色管弦乐 知乎 编辑:程序博客网 时间:2024/05/17 23:02
1,学习这部分,应先了解一下OSI 7层模型,TCP/IP四层,Socket套接字等网络相关知识点。
Python网络库,urllib,urllib2,后者功能更强大一些。
import urllib2import urllibresponse = urllib2.urlopen('http://www.baidu.com') #获取百度首页的代码,打开远程文件urllib.urlretrieve(‘http://www.baidu.com','baidu_index.html')     #下载文件并保存到本地html = response.read()print html
还有smtplib,email,cgi,httplib,ftplib,Cookie等其他模块,现用现查即可。


2,socket模块
服务器端Demo
import sockets = socket.socket() #host = socket.gethostname()port = 1234s.bind((host,port))s.listen(5)while True:     c,addr = s.accept()     print 'client link from:',addr     c.send('Hello, client. This is server')     c.close()

SocketServer模块,简化服务器端编程。
from SocketServer import TCPServer,StreamRequestHandlerclass Handler(StreamRequestHandler):def handle(self):     #处理放在handle方法中addr = self.request.getpeername()print 'get link from:',addrself.wfile.write('welcome, link succeed')server = TCPServer(('',1234),Handler)server.serve_forever()#begin to listen and handle link
#运行结果bowen:~ bowen$ vimSocketServer_server.pybowen:~ bowen$ python SocketServer_server.pyget link from: ('192.168.42.184', 49533)

客户端Demo
import sockets = socket.socket()host = socket.gethostname()port = 1234s.connect((host,port))     #连接服务器print s.recv(1024)s.close()

服务器与客户端通信Demo
bowen:Python bowen$ cat server.pyimport socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#create Socketsock.bind(('localhost',8001))#bind ip and portsock.listen(5)#start listeningwhile True:conn,addr = sock.accept()print 'link from:',addrtry:conn.settimeout(5)buff = conn.recv(1024)if buff == '1':conn.send('welcome to server')#send msg to clientelse:conn.send('Plead go out')except socket.timeout:print 'time out exception'conn.close()#close linkbowen:Python bowen$ cat client.pyimport socketimport timesock = socket.socket()sock.connect(('localhost',8001))time.sleep(2)sock.send('1')print sock.recv(1024)#recv msg from serversock.close()
#运行结果bowen:~ bowen$ vimSocketServer_server.pybowen:~ bowen$ python SocketServer_server.pyget link from: ('192.168.42.184', 49533)


3,异步通信
1,分叉方式(ForkingMixIn);Server类提供了多连接处理,和数据传输服务。
from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandlerclass Server(ForkingMixIn, TCPServer):passclass Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()print 'get link from:',addrself.wfile.write('many links by fork')if __name__ == '__main__':server = Server(('localhost',1234),Handler)server.serve_forever()


2,线程方式(ThreadingMixIn);与分叉处理类似,区别仅在于Server继承的是ThreadingMixIN
from SocketServer import TCPServer,ThreadingMixIn,StreamRequestHandlerclass Server(ThreadingMixIn, TCPServer):passclass Handler(StreamRequestHandler):def handle(self):addr = self.request.getpeername()print 'get link from:',addrself.wfile.write('many links in Thread way')if __name__ == '__main__':server = Server(('localhost',1234),Handler)server.serve_forever()


3,异步I/O方式,select()方法用于对指定的文件描述符进行监视,并在描述符改变时做出响应。还有poll()方法也可实现。
import socket, selects = socket.socket()s.bind(('localhost',1234))s.listen(5)inputs = [s]#store socket reqwhile True:rs,ws,es = select.select(inputs,[],[])#use select()for r in rs:if r is s:conn,addr = s.accept()print 'get link form:',addrinputs.append(conn)#put socket conn  into inputselse:try:    data = r.recv(1024)    disconnected = not dataexcept socket.error:    disconnected = Trueif disconnected:    print r.getpeername(),' disconnected'    inputs.remove(r)else:<span style="white-space:pre"></span>    print data


0 0
原创粉丝点击