python之Socket網路編程,pythonsocket

來源:互聯網
上載者:User

python之Socket網路編程,pythonsocket
什麼是網路?

網路是由節點和連線構成,表示諸多個物件及其相互聯絡。在數學上,網路是一種圖,一般認為專指加權圖。網路除了數學定義外,還有具體的物理含義,即網路是從某種相同類型的實際問題中抽象出來的模型。在電腦領域中,網路是資訊傳輸、接收、共用的虛擬平台,通過它把各個點、面、體的資訊聯絡到一起,從而實現這些資源的共用。網路是人類發展史來最重要的發明,提高了科技和人類社會的發展。

網路通訊的三要素
  • IP地址
    • 用來表示一台獨立的主機
    • 特殊的IP地址 127.0.0.1或稱localhost(表示本地迴環地址,保留地址等),可用於本機測試
  • 連接埠號碼
    • 要將資料發送到對方指定的應用程式上,為了標識這些應用程式,所以給這些網路應用程式都用數字進行標識。為了方便稱呼這些數字,則將這些數字稱為連接埠
  • 傳輸協議
    • TCP協議:傳輸控制通訊協定
      • 連線導向:傳輸之前需要建立串連
      • 在串連過程中進行大量資料轉送
      • 通過三向交握方式串連,屬於安全可靠串連
      • 傳輸速率慢,效率低
    • UDP協議:使用者傳輸協議
      • 面向無串連:傳輸過程不需要建立串連即可傳輸
      • 每個資料轉送的大小都限制在64K以內
      • 傳輸過程不可靠
      • 傳輸速率快,效率高
SOCKET網路編程

如簡單的實現一個WEB小程式

import socketdef handle_request(client): buf = client.recv(1024) client.send(bytes("HTTP/1.1 200 OK\r\n\r\n",'utf8')) client.send(bytes("Hello, World",'utf8'))def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8080)) sock.listen(5) while True: connection, address = sock.accept() handle_request(connection) connection.close()if __name__ == '__main__': main()WEB小程式

 

Python 提供了兩個層級訪問的網路服務:

  • 低層級的網路服務支援基本的 Socket,它提供了標準的 BSD Sockets API,可以訪問底層作業系統Socket介面的全部方法。
  • 進階別的網路服務模組 SocketServer, 它提供了伺服器中心類,可以簡化網路伺服器的開發。

什麼是socket?

  Socket又稱"通訊端",應用程式通常通過"通訊端"向網路發出請求或者應答網路請求,使主機間或者一台電腦上的進程間可以通訊。

Socket()函數:

socket.socket([family[, type[, proto]]])

參數

  • family: 通訊端家族可以使AF_UNIX或者AF_INET
  • type: 通訊端類型可以根據是連線導向的還是非串連分為SOCK_STREAMSOCK_DGRAM
  • protocol: 一般不填預設為0。
通訊流程

1 #######server端########## 2 3 import socket 4 5 sk = socket.socket() 6 address = ('127.0.0.1', 8000) 7 sk.bind(address) 8 sk.listen(3) 9 10 while True:11 conn, addr = sk.accept()12 while True:13 try:14 data = conn.recv(1024)15 print(str(data, 'utf8'))16 if not data:17 break18 inp = input(">>>")19 conn.send(bytes(inp, 'utf8'))20 except Exception:21 break22 23 conn.close()24 25 ##########Client端###########26 import socket27 28 sk = socket.socket()29 address = ('127.0.0.1', 8000)30 sk.connect(address)31 while True:32 inp = input(">>>")33 if inp == "exit":34 break35 sk.send(bytes(inp, 'utf8'))36 data = sk.recv(1024)37 print(str(data, 'utf8'))38 sk.close()簡單放QQ聊天Socket內建方法
s.bind()綁定地址(host,port)到通訊端, 在AF_INET下,以元組(host,port)的形式表示地址。s.listen()開始TCP監聽。backlog指定在拒絕串連之前,作業系統可以掛起的最大串連數量。該值至少為1,大部分應用程式設為5就可以了。s.accept()被動接受TCP用戶端串連,(阻塞式)等待串連的到來
用戶端通訊端s.connect()主動初始化TCP伺服器串連,。一般address的格式為元組(hostname,port),如果串連出錯,返回socket.error錯誤。s.connect_ex()connect()函數的擴充版本,出錯時返回出錯碼,而不是拋出異常
公用用途的通訊端函數s.recv()接收TCP資料,資料以字串形式返回,bufsize指定要接收的最大資料量。flag提供有關訊息的其他資訊,通常可以忽略。s.send()發送TCP資料,將string中的資料發送到串連的通訊端。傳回值是要發送的位元組數量,該數量可能小於string的位元組大小。s.sendall()完整發送TCP資料,完整發送TCP資料。將string中的資料發送到串連的通訊端,但在返回之前會嘗試發送所有資料。成功返回None,失敗則拋出異常。s.recvform()接收UDP資料,與recv()類似,但傳回值是(data,address)。其中data是包含接收資料的字串,address是發送資料的通訊端地址。s.sendto()發送UDP資料,將資料發送到通訊端,address是形式為(ipaddr,port)的元組,指定遠程地址。傳回值是發送的位元組數。s.close()關閉通訊端s.getpeername()返回串連通訊端的遠程地址。傳回值通常是元組(ipaddr,port)。s.getsockname()返回通訊端自己的地址。通常是一個元組(ipaddr,port)s.setsockopt(level,optname,value)設定給定通訊端選項的值。s.getsockopt(level,optname[.buflen])返回通訊端選項的值。s.settimeout(timeout)設定通訊端操作的逾時期,timeout是一個浮點數,單位是秒。值為None表示沒有逾時期。一般,逾時期應該在剛建立通訊端時設定,因為它們可能用於串連的操作(如connect())s.gettimeout()返回當前逾時期的值,單位是秒,如果沒有設定逾時期,則返回None。s.fileno()返回通訊端的檔案描述符。s.setblocking(flag)如果flag為0,則將通訊端設為非阻塞模式,否則將通訊端設為阻塞模式(預設值)。非阻塞模式下,如果調用recv()沒有發現任何資料,或send()調用無法立即發送資料,那麼將引起socket.error異常。s.makefile()建立一個與該通訊端相關連的檔案

執行個體

#########Server端##########import socketimport subprocesssk = socket.socket()address = ('127.0.0.1', 8000)sk.bind(address)sk.listen(3)while True: conn, addr = sk.accept() while True: try: data = conn.recv(1024) except Exception: break if not data: break # print(str(data, 'utf8')) # data = str(data, 'utf8')#解碼同decode obj = subprocess.Popen(data.decode('utf8'), shell=True, stdout=subprocess.PIPE) ssh_result = obj.stdout.read() result_len = bytes(str(len(ssh_result)),'utf8') conn.send(result_len) conn.send(ssh_result)conn.close()#########Client#########import socketsk = socket.socket()address = ('127.0.0.1', 8000)sk.connect(address)while True: inp = input(">>>") if inp == "exit": break sk.send(bytes(inp, 'utf8')) result_len = int(str(sk.recv(1024), 'utf8')) print(result_len) data = bytes() while len(data) != result_len: recv = sk.recv(1024) data += recv print(str(data, 'gbk'))sk.close()簡單訪SSH功能操作檔案上傳import socketimport ossk = socket.socket()address = ('127.0.0.1', 8000)sk.bind(address)sk.listen(3)BASE_DIR = os.path.dirname(os.path.abspath(__file__))while True: conn, addr = sk.accept() while True: data = conn.recv(1024) cmd, file_name, file_size = str(data, 'utf8').split('|') path = os.path.join(BASE_DIR, 'model', file_name) file_size = int(file_size) f = open(path, 'ab') has_recv = 0 while has_recv != file_size: data = conn.recv(1024) f.write(data) has_recv += len(data) f.close()Serverimport socketimport ossk = socket.socket()address = ('127.0.0.1', 8000)sk.connect(address)BASE_DIR = os.path.dirname(os.path.abspath(__file__))while True: inp = input(">>>>").strip() path = os.path.join(BASE_DIR, inp) file_name = os.path.basename(path) file_size = os.stat(path).st_size file_info = 'post|%s|%s' % (file_name, file_size) sk.sendall(bytes(file_info, 'utf8')) f = open(path, 'rb') has_sent = 0 while has_sent != file_size: data = f.read(1024) sk.sendall(data) has_sent += len(data) f.close() print("上傳成功")Client socketserver

socketserver模組簡化了網路編程服務程式的任務,同時SocketServer模組也是Python標準庫中很多伺服器架構的基礎。

學習它的最好辦法是自己瀏覽一遍它的源碼。

首先先看一下如何去運用

import socketserverclass MyServer(socketserver.BaseRequestHandler): def handle(self): print("服務端啟動") while True: conn = self.request while True: data = conn.recv(1024) print(str(data, 'utf8')) inp = input(">>>>>") conn.sendall(bytes(inp, 'utf8')) conn.close()if __name__ == '__main__': server = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyServer) server.serve_forever()serverimport socketsk = socket.socket()address = ('127.0.0.1', 8080)sk.connect(address)print("用戶端啟動")while True: inp = input(">>>>>") sk.sendall(bytes(inp, 'utf8')) if inp == "q": break data = sk.recv(1024) print(str(data, 'utf8'))sk.close()client

此代碼簡單的實現了server端能同時和多個client聊天的功能。

我們在看源碼前,首先要明確的是它分了幾個類及每個類的功能作用等。

There are five classes in an inheritance diagram, four of which represent
synchronous servers of four types:

 下面的就不一一詳細說了,想要瞭解的更透徹,還是看一遍源碼吧。

  

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.