python 網絡編程詳解
網絡編程的專利權應該屬于Unix,各個平臺(如windows、Linux等)、各門語言(C、C++、Python、Java等)所實現的符合自身特性的語法都大同小異。在我看來,懂得了Unix的socket網絡編程,其他的形式的網絡編程方法也就知道了。這句話說得還不太嚴謹。準確的應該說成懂得了socket編程的原理,網絡編程也就知道了,不同之處就在于每個平臺,每個語言都有自己專享的語法,我們直接靈活套用就行了。
下面是用python實現的最基本的網絡編程的例子,即依托于客戶端-服務器的架構,實現客戶端與服務器之間的單向“數據流通”。我們分別用兩個方法來實現,一個方法是最原始的socket編程,另一個方法是利用python的面向對象對第一種方法進行封裝實現,目的是減少實現透明性,便于快速開發。
要求:客戶端輸入數據,發送到服務端,服務器端生成(時間戳+數據)的封裝數據回應客戶端。由于socket編程包括兩種:面向連接的和無連接的,這兩種分別對應TCP數據流和UDP數據報文。所以,我們兩種方法都進行實現。
一、Python socket編程
面向連接的TCP socket編程:
# -*- coding: utf-8 -*- 3 from socket import * from time import ctime # Address and Port HOST = '' PORT = 21567 ADDR = (HOST, PORT) # BuffSize BUFSIZ = 1024 # build socket tcpSerSock = socket(AF_INET, SOCK_STREAM) # bind socket tcpSerSock.bind(ADDR) # listen 5 client tcpSerSock.listen(5) try: while True: print 'waiting for connection...' # build client socket tcpCliSock, addr = tcpSerSock.accept() print '...connect from:', addr # accept data and process while True: data = tcpCliSock.recv(BUFSIZ) if not data: break tcpCliSock.send('[%s] %s' % (ctime(), data)) # close client socket tcpCliSock.close() except EOFError, KeyboardInterrupt: tcpSerSock.close()
# -*- coding:utf-8 -*- from socket import * # Address and Port HOST = '127.0.0.1' PORT = 21567 ADDR = (HOST, PORT) # BufferSize BUFSIZ = 1024 #build socket tcpCliSocket = socket(AF_INET, SOCK_STREAM) tcpCliSocket.connect(ADDR) while True: data = raw_input('> ') if not data: break # send data tcpCliSocket.send(data) # recv data data = tcpCliSocket.recv(BUFSIZ) if not data: break # show data print data tcpCliSocket.close()
無連接的UDP socket編程
# -*- coding: utf-8 -*- from socket import * from time import ctime # Address and Port HOST = '' PORT = 8000 ADDR = (HOST, PORT) # BufferSize BUFFSIZE = 1024 # build socket udpSerSock = socket(AF_INET, SOCK_DGRAM) # bind socket udpSerSock.bind(ADDR) try: while True: print 'waiting the message...' data, addr = udpSerSock.recvfrom(BUFFSIZE) print 'received the message: '+data+' from: ', addr udpSerSock.sendto('[%s] %s' % (ctime(), data), addr) except EOFError, KeyboardInterrupt: udpSerSock.close()
# -*- coding: utf-8 -*- from socket import * # Address and Port HOST = 'localhost' PORT = 8000 ADDR = (HOST, PORT) # BufferSize BUFSIZ = 1024 # build socket udpCliSock = socket(AF_INET, SOCK_DGRAM) while True: data = raw_input('> ') udpCliSock.sendto(data, ADDR) data = udpCliSock.recvfrom(BUFSIZ) if not data: break print data udpCliSock.close()
二、基于封裝類SocketServer的網絡編程
# -*- coding: utf-8 -*- from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH from time import ctime # Address and Port HOST = '' PORT = 21567 ADDR = (HOST, PORT) # BuffSize BUFSIZ = 1024 # build RequestHandler class MyRequestHandler(SRH): def handle(self): print '...connected from: ', self.client_address self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline())) # build TCPServer TCPServ = TCP(ADDR, MyRequestHandler) print 'waiting for connection...' # loop to process TCPServ.serve_forever()
# -*- coding:utf-8 -*- from socket import * # Address and Port HOST = '127.0.0.1' PORT = 21567 ADDR = (HOST, PORT) # BufferSize BUFSIZ = 1024 while True: # note: SocketServer 的請求處理器的默認行為是接受連接, # 得到請求,然后就關閉連接,所以需要多次連接 tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR) # process data data = raw_input('> ') if not data: break tcpCliSock.send('%s\r\n' % data) data = tcpCliSock.recv(BUFSIZ) if not data: break print data.strip() tcpCliSock.close()
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
