亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中的套接字編程有什么用

發布時間:2021-06-21 13:50:26 來源:億速云 閱讀:181 作者:chen 欄目:開發技術

這篇文章主要介紹“Python中的套接字編程有什么用”,在日常操作中,相信很多人在Python中的套接字編程有什么用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python中的套接字編程有什么用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Why use Sockets?

套接字是網絡的基礎。它們使在兩個不同程序或設備之間的信息傳輸成為可能。例如,當您打開瀏覽器時,您作為客戶端正在與服務器建立連接以進行信息傳輸。

在深入探討這種通信之前,讓我們首先弄清楚這些插座的確切含義。

What are Sockets?

一般而言,套接字是為發送和接收數據而構建的內部端點。單個網絡將具有兩個套接字,每個通信設備或程序一個。這些套接字是IP地址和端口的組合。根據所使用的端口號,單個設備可以具有n個插槽。不同的端口可用于不同類型的協議。請看以下圖像,以了解有關一些常見端口號和相關協議的更多信息:

Python中的套接字編程有什么用

現在您已經了解了套接字的概念,現在讓我們看一下Python的Socket模塊:

如何在Python中實現Socket編程:

要使用Python實現Socket編程,您將需要導入socket模塊或框架。該模塊由創建套接字并幫助它們彼此關聯所需的內置方法組成。

一些重要的方法如下:

Python中的套接字編程有什么用

既然您已經了解了套接字模塊的重要性,那么讓我們繼續看一下它如何為Python中的套接字編程創建服務器和客戶端。

什么是服務器?

服務器可以是程序,計算機或專用于管理網絡資源的設備。服務器可以在同一臺設備或計算機上,也可以在本地連接到其他設備和計算機,甚至可以遠程連接。有各種類型的服務器,例如數據庫服務器,網絡服務器,打印服務器等。

服務器通常使用諸如socket.socket(),socket.bind(),socket.listen()等方法來建立連接并綁定到客戶端。現在,讓我們編寫一個程序來創建服務器。考慮以下示例:

例子:

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(),1234))          
#port number can be anything between 0-65535(we usually specify non-previleged ports which are > 1023)
s.listen(5)
 
while True:
    clt,adr=s.accept()
    print(f"Connection to {adr}established")  
   #f string is literal string prefixed with f which 
   #contains python expressions inside braces
    clt.send(bytes("Socket Programming in Python","utf-8 ")) #to send info to clientsocket

如您所見,創建套接字的第一個必要條件是導入套接字模塊。之后,使用socket.socket()方法創建服務器端套接字。

NOTE

AF_INET是指Internet上的地址,它需要一對(主機,端口),其中主機可以是某個特定網站的URL或它的地址,并且端口號是整數。SOCK_STREAM用于創建TCP協議。

bind()方法接受兩個參數作為元組(主機,端口)。但是,最好使用4位數字的端口號,因為通常占用較小的端口號。listen()方法允許服務器接受連接。在這里,5是同時出現的多個連接的隊列。此處可以指定的最小值為0(如果您提供較小的值,則將其更改為0)。如果未指定任何參數,則采用默認的合適參數。

在while循環允許接受連接永遠。“ clt”和“ adr”是客戶端對象和地址。print語句僅打印出客戶端套接字的地址和端口號。最后,clt.send用于發送字節數據。

現在我們的服務器已經準備好了,讓我們繼續前進到客戶端。

什么是客戶端?

客戶端是從服務器接收信息或服務的計算機或軟件。在客戶端服務器模塊中,客戶端從服務器請求服務。最好的例子是Web瀏覽器,例如Google Chrome,Firefox等。這些Web瀏覽器向Web服務器請求用戶指示的所需網頁和服務。其他示例包括在線游戲,在線聊天等。

現在讓我們看一下如何用Python編程語言編寫客戶端程序:

例子:

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
msg=s.recv(1024)
print(msg.decode("utf-8"))

第一步是導入套接字模塊,然后創建套接字,就像創建服務器時一樣。然后,要在客戶端-服務器之間創建連接,您需要通過指定(主機,端口)使用connect()方法。

注意:當客戶端和服務器位于同一臺計算機上時,將使用gethostname。(LAN –本地IP / WAN –公用IP)

在這里,客戶端希望從服務器接收一些信息,為此,您需要使用recv()方法,并且該信息存儲在另一個變量msg中。請記住,傳遞的信息將以字節為單位,并且在上述程序的客戶端中,一次傳輸最多可接收1024個字節(緩沖區大小)。可以指定任意數量,具體取決于傳輸的信息量。

最后,正在傳輸的消息應進行解碼和打印。

既然您已經知道如何創建客戶端-服務器程序,那么讓我們繼續看看如何執行它們。

Echo Client-Server:

要執行這些程序,請打開命令提示符,進入創建了客戶端和服務器程序的文件夾,然后鍵入:

py server.py(在這里,server.py是服務器的文件名,您也可以使用py -3.7 server.py)

完成此操作后,服務器將開始運行。要執行客戶端,請打開另一個cmd窗口,然后鍵入:

py client.py(此處,client.py是客戶端的文件名)

輸出(服務器): 

Python中的套接字編程有什么用

(客戶)

Python中的套接字編程有什么用

讓我們通過將緩沖區大小減小到7來嘗試相同的程序,然后看看我們得到什么輸出:
輸出: 

Python中的套接字編程有什么用

如您所見,連接在傳輸7個字節后終止。但這是一個問題,因為您尚未收到完整的信息,并且連接已關閉。讓我們繼續解決這個問題。

Multiple Communications:

為了使連接一直持續到客戶端收到完整的信息,可以使用while循環:

例子:

import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2346))
while True:
msg=s.recv(7)
print(msg.decode("utf-8"))

完成此操作后,每次傳輸將以7個字節的形式接收完整的消息。

但是這一次,如您所見,連接不會終止,您也不知道何時會發生連接。除此之外,如果您實際上不知道客戶端將從服務器接收到的消息或信息有多大,該怎么辦。在這種情況下,您實際上可以在客戶端使用以下代碼:

例子:

complete_info=''
while True:
    msg = s.recv(7)  
    if len(msg)<=0:
        break
    complete_info += msg.decode("utf-8")
print(complete_info)

在服務器端,使用close()方法,如下所示:

clt.close()

輸出如下圖所示:

輸出:

Python中的套接字編程有什么用

上面的代碼塊所做的全部工作是,檢查信息的大小,并一次將其打印在兩個字節的緩沖區中,再在完成連接后將其關閉。

傳輸Python對象:

直到這里,您才有了傳輸字符串的訣竅。但是,Python中的套接字編程也允許您傳輸Python對象。這些對象可以是集合,元組,字典等任何對象。要實現此目的,您將需要導入Python的pickle模塊。

Python pickle模塊:

當您實際上在python中序列化或反序列化對象時,Python pickle模塊就會出現。讓我們看一個小例子,

例子:

import pickle
 
mylist=[1,2,'abc']
mymsg = pickle.dumps(mylist) 
print(mymsg)

輸出: 

b'x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。

如您所見,在上面的程序中,使用pickle模塊的dumps()函數對'mylist'進行了序列化。還要注意,輸出以“ b”開頭,這意味著它已轉換為字節。在套接字編程中,可以實現此模塊以在客戶端和服務器之間傳輸python對象。

如何使用pickle模塊傳遞python對象結構?

當您將泡菜與套接字一起使用時,您絕對可以通過網絡傳輸任何內容。讓我們寫下服務器端和客戶端對應項,以將列表從服務器傳輸到客戶端:

服務器端:

import socket
import pickle
 
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 2133))        #binding tuple
s.listen(5)
while True:
    clt , adr = s.accept()
    print(f"Connection to {adr}established")
 
    m={1:"Client", 2:"Server"}
    mymsg = pickle.dumps(m)  #the msg we want to print later
    mymsg = {len(mymsg):{a}}"utf-8") + mymsg
    clt.send(mymsg)

在這里,m是一個字典,它基本上是一個python對象,需要從服務器發送到客戶端。這是通過首先使用dumps()序列化對象,然后將其轉換為字節來完成的。現在讓我們寫下客戶端對應的內容:

客戶端:

import socket
import pickle
a=10
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 2133))
 
while True:
    complete_info = b''
    rec_msg = True
    while True:
        mymsg = s.recv(10)
       if rec_msg:
            print(f"The length of message = {mymsg[:a]}")
            x = int (mymsg[:a ] )
            rec_msg = False
            complete_info += mymsg
            if len(complete_info)-a == x:
            print("Recieved the complete info")
            print(complete_info[a:])
            m = pickle.loads(complete_info[a:])
            print(m)
            rec_msg = True
complete_info = b''
print(complete_info)

第一個while循環將幫助我們跟蹤完整消息(complete_info)以及正在使用緩沖區接收的消息(rec_msg)。通過設置rec_設置消息,然后,在接收消息時,我所做的就是打印每個消息,并在大小為10的緩沖區中接收該消息。此大小可以是任何值,具體取決于您的個人選擇。

然后,如果收到的消息等于完整的消息,那么我只是將消息打印為已接收的完整信息,然后使用loads()將消息反序列化。上面程序的輸出如下:

Python中的套接字編程有什么用

到此,關于“Python中的套接字編程有什么用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

甘泉县| 高密市| 怀远县| 玉屏| 阿克陶县| 大方县| 临泉县| 昔阳县| 柯坪县| 富顺县| 青岛市| 平罗县| 穆棱市| 壤塘县| 缙云县| 浦北县| 陵川县| 内乡县| 湛江市| 区。| 正镶白旗| 延津县| 蚌埠市| 凌海市| 杨浦区| 沁源县| 阿鲁科尔沁旗| 龙川县| 桂平市| 上犹县| 武穴市| 将乐县| 忻城县| 石门县| 来安县| 高清| 安岳县| 磴口县| 江安县| 济南市| 龙里县|