Python網絡編程常用代碼
阿新 • • 發佈:2018-01-10
通信 sockets bind 任務管理 編譯 space gist bar read
?
服務器端代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# -*- coding: cp936 -*-
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #初始化socket
sock.bind(( "127.0.0.1" , 8001 )) #綁定本機地址,8001端口
sock.listen( 5 ) #等待客戶連接
while True :
print "waiting client connection..." connection,address = sock.accept() #接收客戶連接請求
print "a client have connected..."
while True :
try :
connection.settimeout( 5 ) #設置超時時間
buf = connection.recv( 1024 ) #接收數據
if buf = = "1" :
connection.send( "you have send me 1!welcome to server!" )
elif buf = = "2" :
connection.send( "you have send me 2!I have recv!" )
elif buf = = "3" :
connection.send( "close the connection!" )
break
else :
connection.send( "unknow command!" )
except socket.timeout:
print "time out"
connection.close()
print "a client exit..."
|
客戶器端代碼:
1 2 3 4 5 6 7 8 9 10 11 12 |
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(( "127.0.0.1" , 8001 ))
import time
time.sleep( 2 )
while True :
data = raw_input ( "input command:" );
sock.send(data)
print sock.recv( 1024 )
if data = = "3" :
break
sock.close()
|
1.首先開兩個IDLE,分別打開服務器端和客戶器端代碼。
2.F5運行服務器端代碼,會出現waiting client connection...
3.F5運行客戶端代碼,會出現input command: ;
4.這時服務器和客戶端就連接上了,可以正常的通信啦,如圖:
5.再次運行服務器端代碼時會出現錯誤,這時可以通過任務管理器,將其中的pythonw.exe進程結束,重新打開,編譯就可以啦!
客戶端:
?1 2 3 4 5 6 |
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.connect((host, port))
print s.recv( 1024 )
|
服務端:
?1 2 3 4 5 6 7 8 9 10 11 12 |
import socket
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen( 5 )
while True :
c, addr = s.accept()
print ‘Got connection from‘ , addr
c.send( ‘Thank you for connecting‘ )
c.close()
|
http編程
?1 2 |
from urllib import urlopen
webpage = urlopen( ‘http://www.python.org‘ )
|
加上正規表達式
?1 2 3 4 |
import re
text = webpage.read()
m = re.search( ‘<a href="([^"]+)" .*?>about</a>‘ , text, re.IGNORECASE)
m.group( 1 )
|
urllib
urllib2
一個基於SocketServer的小型服務器例子:
1 2 3 4 5 6 7 8 9 |
from SocketServer import TCPServer, StreamRequestHandler
>>> class Handler(StreamRequestHandler):
def handle( self ):
addr = self .request.getpeername()
print ‘Got connection from‘ , addr
self .wfile.write( ‘Thank you for connecting‘ )
>>> server = TCPServer((‘‘, 1234 ), Handler)
>>> server.serve_forever()
|
使用SocketServer進行分叉和線程處理
分叉Server:
1 2 3 4 5 6 7 8 9 |
from SocketServer import TCPServer,ForkingMinIn, StreamRequestHandler
class Server(ForkingMinIn, TCPServer): pass
class Handler(StreamRequestHandler):
def handle( self ):
addr = self .request.getpeername()
print ‘Got connection from‘ ,addr
self .wfile.write( ‘Thank you for connection‘ )
server = Server((‘‘, 1234 ),Handler)
server.serve_forever()
|
線程Server:
?1 2 3 4 5 6 7 8 9 |
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
class Server(ThreadingMixIn, TCPServer): pass
class Handler(StreamRequestHandler):
def handle( self ):
addr = self .request.getpeername()
print ‘Got connection from‘ ,addr
self .wfile.write( ‘Thank you for connecting‘ )
server = Server((‘‘, 1234 ),Handler)
server.serve_forever()
|
帶有select和pool的異步I/O
select服務:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import socket, select
s = socket.socket()
host = socket.gethostname()
prot = 1234
s.bind((host,port))
s.listen( 5 )
inputs = [s]
while True :
rs,ws,es = select.select(inputs,[],[])
for r in rs:
if r is s:
c, addr = s.accept()
print ‘Got connection from‘ ,addr
inputs.append(c)
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
|
pool服務器:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import socket, select
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
fdmap = {s.fileno():s}
s.listen( 5 )
p = select.poll()
p.register(s)
while True :
events = p.poll()
for fd, event in events:
if fd in fdmap:
c, addr = s.accept()
print ‘Got connection from‘ , addr
p.register(c)
fdmap[c.fileno()] = c
elif event & select.POLLIN:
data = fdmap[fd].recv( 1024 )
if not data:
print fdmap[fd].getpeername(), ‘disconnected‘
p.unregister(fd)
del fdmap[fd]
else :
print data
|
Python網絡編程常用代碼