摘要:中卻發生了異常。接收數據使用函數接收數據在中返回的是對象,在中返回的是。注意函數返回的數據長度是小于或者等于參數指定的長度的,要接收到指定長度的數據,需要循環接收數據。當一個被回收時會自動關閉,但是不要依賴這種機制,不需要時就主動的。
本文介紹使用Python進行Socket網絡編程,假設讀者已經具備了基本的網絡編程知識和Python的基本語法知識,本文中的代碼如果沒有說明則都是運行在Python 3.4下。
Python的socket功能封裝在socket庫中,要使用socket,記得先import socket,socket庫的詳細介紹參見官方文檔。
首先創建一個socket,使用socket庫中得socket函數創建。
Pythonimport socket # create an INET, STREAM socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
例子中創建了一個TCP socket,socket.socket函數的前兩個參數的默認值是socket.AF_INET和socket.SOCK_STREAM,創建TCP socket時可以直接寫成socket.socket()。
連接服務器使用socket的connect函數連接到服務器,以下幾種參數都是合法的。
Pythons.connect(("localhost", 8000)) s.connect(("127.0.0.1", 8000)) s.connect(("www.baidu.com", 80))發送數據
發送數據有兩個方法send和sendall,send不能保證所有的數據都發送完了,它會返回已發送數據的長度,程序要循環發送數據直到所有數據都已發送完畢。
Pythondef mysend(s, msg): total_len = len(msg) total_sent = 0 while total_sent < total_len: sent = s.send(msg[total_sent:]) if sent == 0: raise RuntimeError("socket connection broken") total_sent += sent
sendall能夠保證所有的數據都已發送完畢,除非發送過程中出現了錯誤,它實際上也是循環發送數據直到所有數據發送完成。
這里還要講一個需要特別注意的地方,從一個例子開始吧:
Pythonimport socket s = socket.socket() s.connect(("www.baidu.com", 80)) s.sendall("test")
都是上面講過的東西,沒什么特別的,分別在Python 2和Python 3中執行以上的代碼,結果是:
Python# Python 2.7 >>> import socket >>> s = socket.socket() >>> s.connect(("www.baidu.com", 80)) >>> s.sendall("test")
Python 2中執行成功。
Python# Python 3.4 >>> import socket >>> s = socket.socket() >>> s.connect(("www.baidu.com", 80)) >>> s.sendall("test") Traceback (most recent call last): File "", line 1, in TypeError: "str" does not support the buffer interface
Python 3中卻發生了異常。
同樣的代碼換個環境卻不能執行了,我沒有寫錯呀,怒砸電腦。好吧,你確實沒寫錯,是環境變了,導致這個結果的變化請移步官方的說明。
接收數據使用recv函數接收數據:
Pythondata = s.recv(4096)
在Python 3中返回的是bytes對象,在Python 2中返回的是string。注意函數返回的數據長度是小于或者等于參數指定的長度的,要接收到指定長度的數據,需要循環接收數據。
Pythondef myreceive(s, msglen): chunks = [] bytes_recd = 0 while bytes_recd < msglen: chunk = s.recv(min(msglen - bytes_recd, 2048)) if chunk == b"": raise RuntimeError("socket connection broken") chunks.append(chunk) bytes_recd = bytes_recd + len(chunk) return b"".join(chunks)關閉連接
當連接不再需要時可以使用close關閉socket連接,關閉后的連接不能再進行任何操作。當一個socket被回收時會自動關閉,但是不要依賴這種機制,不需要socket時就主動的close。
服務端服務端程序執行的步驟:
1. 創建服務端socket
1. 將服務端socket綁定到指定的地址和端口
1. 監聽連接
1. 接受客戶端連接
1. 處理客戶端的數據
1. 關閉客戶端連接
一個簡單的echo server示例:
Pythonimport socket HOST = "" PORT = 10022 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(10) conn, addr = s.accept() while True: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close()
客戶端程序:
Pythonimport socket HOST = "localhost" PORT = 10022 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) s.sendall(b"hello socket") data = s.recv(1024) print("Received", repr(data)) s.close()錯誤處理
socket處理過程中發生錯誤會拋出異常,socket相關的異常有:
- socket.error
- socket.herror
- socket.gaierror
- socket.timeout
Pythonimport socket HOST = None PORT = 10022 try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((HOST, PORT)) s.listen(10) except: socket.error as msg: print(msg)參考資料
Socket Programming HOWTO
Porting Python 2 Code to Python 3
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37491.html
摘要: Abstract Sockets are used nearly everywhere, but are one of the most severely misunderstood technologies around. This is a 10,000 foot overview of sockets. It’s not really a tutorial - you’ll s...
摘要:同時無論在哪種平臺上,都可以用進行系統編程。這樣導入模塊并使用生成隨機數中的模塊提供了生成隨機數的函數。生成的隨機數介于和之間。可以從自己定義的范圍中生成一個隨機數,如下所示操作日期和時間你可以從日期中提取所需的值,如下所示。 翻譯:瘋狂的技術宅https://likegeeks.com/python-... 本文首發微信公眾號:前端先鋒歡迎關注,每天都給你推送新鮮的前端技術文章 ...
摘要:本文原發于個人博客在英文中的含義為連接兩個物品的凹槽,像,意為眼窩,此外還有插座的意思。協議,所是用的傳輸協議,目前有三種。,也稱為無連接的,使用協議。當函數返回時,意味著對端已經關閉。 本文原發于個人博客 Socket 在英文中的含義為(連接兩個物品的)凹槽,像the eye socket,意為眼窩,此外還有插座的意思。在計算機科學中,socket 通常是指一個連接的兩個端點,這里的...
摘要:當一個客戶端連接時,它將返回一個新的對象,對象中有表示當前連接的和一個由主機端口號組成的連接的元組,更多關于元組值的內容可以查看地址族一節中的詳情這里必須要明白我們通過調用方法擁有了一個新的對象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 說明 本書翻譯自 realpython 網站上的文章教程 ...
閱讀 1809·2019-08-30 13:54
閱讀 2725·2019-08-29 17:27
閱讀 1109·2019-08-29 17:23
閱讀 3350·2019-08-29 15:20
閱讀 1225·2019-08-29 11:28
閱讀 1566·2019-08-26 10:39
閱讀 1315·2019-08-26 10:29
閱讀 639·2019-08-26 10:13