服務器端代碼:
# -*- 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..."客戶器端代碼:
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": breaksock.close() 1.首先開兩個IDLE,分別打開服務器端和客戶器端代碼。
2.F5運行服務器端代碼,會出現waiting client connection...
3.F5運行客戶端代碼,會出現input command: ;
4.這時服務器和客戶端就連接上了,可以正常的通信啦,如圖:

5.再次運行服務器端代碼時會出現錯誤,這時可以通過任務管理器,將其中的pythonw.exe進程結束,重新打開,編譯就可以啦!
客戶端:
import sockets=socket.socket()host = socket.gethostname()port = 1234s.connect((host, port))print s.recv(1024)
服務端:
import sockets = socket.socket()host = socket.gethostname()port = 1234s.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編程
from urllib import urlopenwebpage = urlopen('http://www.python.org')加上正規表達式
import retext = webpage.read()m = re.search('<a href="([^"]+)" .*?>about</a>', text, re.IGNORECASE)m.group(1) urllib
urllib2
一個基于SocketServer的小型服務器例子:
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:
from SocketServer import TCPServer,ForkingMinIn, StreamRequestHandlerclass Server(ForkingMinIn, TCPServer):passclass 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:
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandlerclass Server(ThreadingMixIn, TCPServer):passclass 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服務:
import socket, selects = socket.socket()host = socket.gethostname()prot = 1234s.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服務器:
import socket, selects = socket.socket()host = socket.gethostname()port = 1234s.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 dataTwisted網絡框架
新聞熱點
疑難解答