python 網(wǎng)絡(luò)編程詳解及簡(jiǎn)單實(shí)例
python 網(wǎng)絡(luò)編程詳解
網(wǎng)絡(luò)編程的專利權(quán)應(yīng)該屬于Unix,各個(gè)平臺(tái)(如windows、Linux等)、各門語(yǔ)言(C、C++、Python、Java等)所實(shí)現(xiàn)的符合自身特性的語(yǔ)法都大同小異。在我看來(lái),懂得了Unix的socket網(wǎng)絡(luò)編程,其他的形式的網(wǎng)絡(luò)編程方法也就知道了。這句話說(shuō)得還不太嚴(yán)謹(jǐn)。準(zhǔn)確的應(yīng)該說(shuō)成懂得了socket編程的原理,網(wǎng)絡(luò)編程也就知道了,不同之處就在于每個(gè)平臺(tái),每個(gè)語(yǔ)言都有自己專享的語(yǔ)法,我們直接靈活套用就行了。
下面是用python實(shí)現(xiàn)的最基本的網(wǎng)絡(luò)編程的例子,即依托于客戶端-服務(wù)器的架構(gòu),實(shí)現(xiàn)客戶端與服務(wù)器之間的單向“數(shù)據(jù)流通”。我們分別用兩個(gè)方法來(lái)實(shí)現(xiàn),一個(gè)方法是最原始的socket編程,另一個(gè)方法是利用python的面向?qū)ο髮?duì)第一種方法進(jìn)行封裝實(shí)現(xiàn),目的是減少實(shí)現(xiàn)透明性,便于快速開(kāi)發(fā)。
要求:客戶端輸入數(shù)據(jù),發(fā)送到服務(wù)端,服務(wù)器端生成(時(shí)間戳+數(shù)據(jù))的封裝數(shù)據(jù)回應(yīng)客戶端。由于socket編程包括兩種:面向連接的和無(wú)連接的,這兩種分別對(duì)應(yīng)TCP數(shù)據(jù)流和UDP數(shù)據(jù)報(bào)文。所以,我們兩種方法都進(jìn)行實(shí)現(xiàn)。
一、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()
無(wú)連接的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的網(wǎng)絡(luò)編程
# -*- 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 的請(qǐng)求處理器的默認(rèn)行為是接受連接, # 得到請(qǐng)求,然后就關(guān)閉連接,所以需要多次連接 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()
感謝閱讀,希望能幫助大家,謝謝大家對(duì)本站的支持!
- python網(wǎng)絡(luò)編程之TCP通信實(shí)例和socketserver框架使用例子
- python網(wǎng)絡(luò)編程之UDP通信實(shí)例(含服務(wù)器端、客戶端、UDP廣播例子)
- Python 網(wǎng)絡(luò)編程起步(Socket發(fā)送消息)
- python socket網(wǎng)絡(luò)編程步驟詳解(socket套接字使用)
- Python 網(wǎng)絡(luò)編程說(shuō)明
- 用Python進(jìn)行TCP網(wǎng)絡(luò)編程的教程
- python網(wǎng)絡(luò)編程調(diào)用recv函數(shù)完整接收數(shù)據(jù)的三種方法
- python網(wǎng)絡(luò)編程實(shí)例簡(jiǎn)析
- Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)
- python網(wǎng)絡(luò)編程:socketserver的基本使用方法實(shí)例分析
相關(guān)文章
Python?queue雙端隊(duì)列模塊及用法小結(jié)
雙端隊(duì)列是一種具有隊(duì)列和棧性質(zhì)的線性數(shù)據(jù)結(jié)構(gòu),本文主要介紹了Python?queue雙端隊(duì)列模塊及用法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02python SQLAlchemy的Mapping與Declarative詳解
這篇文章主要介紹了python SQLAlchemy的Mapping與Declarative詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07pyqt 實(shí)現(xiàn)在Widgets中顯示圖片和文字的方法
今天小編就為大家分享一篇pyqt 實(shí)現(xiàn)在Widgets中顯示圖片和文字的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06使用Python的web.py框架實(shí)現(xiàn)類似Django的ORM查詢的教程
這篇文章主要介紹了使用Python的web.py框架實(shí)現(xiàn)類似Django的ORM查詢的教程,集成的ORM操作數(shù)據(jù)庫(kù)向來(lái)是Python最強(qiáng)大的功能之一,本文則探討如何在web.py框架上實(shí)現(xiàn),需要的朋友可以參考下2015-05-05python使用梯度下降和牛頓法尋找Rosenbrock函數(shù)最小值實(shí)例
這篇文章主要介紹了python使用梯度下降和牛頓法尋找Rosenbrock函數(shù)最小值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python Tkinter Entry和Text的添加與使用詳解
這篇文章主要介紹了Python Tkinter Entry和Text的添加與使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03