Python笔记之网络编程

1,学习这部分,应先了解一下OSI 7层模型,TCP/IP四层,Socket套接字等网络相关知识点。
Python网络库,urllib,urllib2,后者功能更强大一些。
import urllib2
import urllib
response = 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 socket
s = socket.socket() #
host = socket.gethostname()
port = 1234
s.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,StreamRequestHandler

class Handler(StreamRequestHandler):
	def handle(self):     #处理放在handle方法中
		addr = self.request.getpeername()
		print 'get link from:',addr
		self.wfile.write('welcome, link succeed')

server = TCPServer(('',1234),Handler)
server.serve_forever()	#begin to listen and handle link
#运行结果
bowen:~ bowen$ vimSocketServer_server.py
bowen:~ bowen$ python SocketServer_server.py
get link from: ('192.168.42.184', 49533)

客户端Demo
import socket

s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host,port))     #连接服务器
print s.recv(1024)
s.close()

服务器与客户端通信Demo
bowen:Python bowen$ cat server.py
import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)	#create Socket
sock.bind(('localhost',8001))	#bind ip and port
sock.listen(5)	#start listening
while True:
	conn,addr = sock.accept()
	print 'link from:',addr
	try:
		conn.settimeout(5)
		buff = conn.recv(1024)
		if buff == '1':
			conn.send('welcome to server')	#send msg to client
		else:
			conn.send('Plead go out')
	except socket.timeout:
		print 'time out exception'
	conn.close()	#close link

bowen:Python bowen$ cat client.py
import socket
import time

sock = socket.socket()
sock.connect(('localhost',8001))
time.sleep(2)
sock.send('1')
print sock.recv(1024)	#recv msg from server
sock.close()
#运行结果
bowen:~ bowen$ vimSocketServer_server.py
bowen:~ bowen$ python SocketServer_server.py
get link from: ('192.168.42.184', 49533)


3,异步通信
1,分叉方式(ForkingMixIn);Server类提供了多连接处理,和数据传输服务。
from SocketServer import TCPServer,ForkingMixIn,StreamRequestHandler

class Server(ForkingMixIn, TCPServer):
	pass

class Handler(StreamRequestHandler):
	def handle(self):
		addr = self.request.getpeername()
		print 'get link from:',addr
		self.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,StreamRequestHandler

class Server(ThreadingMixIn, TCPServer):
	pass

class Handler(StreamRequestHandler):
	def handle(self):
		addr = self.request.getpeername()
		print 'get link from:',addr
		self.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, select
s = socket.socket()
s.bind(('localhost',1234))
s.listen(5)

inputs = [s]	#store socket req
while 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:',addr
			inputs.append(conn)	#put socket conn  into inputs
		else:
			try:
				    data = r.recv(1024)
				    disconnected = not data
			except socket.error:
				    disconnected = True
			if disconnected:
				    print r.getpeername(),' disconnected'
				    inputs.remove(r)
			else:
					    print data


你可能感兴趣的:(Python基础)