最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python基礎(chǔ)之Socket套接字詳解

 更新時間:2021年04月23日 11:38:52   作者:小馬哥的班車  
這篇文章主要介紹了python基礎(chǔ)之Socket套接字詳解,文中有非常詳細的代碼示例,對正在學習python基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下

前言

Python語言提供了Socket套接字來實現(xiàn)網(wǎng)絡(luò)通信。

Python的應(yīng)用程序通常通過Socket"套接字"向網(wǎng)絡(luò)發(fā)出請求或者應(yīng)答網(wǎng)絡(luò)請求,使主機間或者一臺計算機上的進程間可以通訊。

服務(wù)器和客戶端的源代碼

服務(wù)器端

#coding=utf-8
#創(chuàng)建TCP服務(wù)器
import socket
import time
from time import ctime

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE=1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.bind((HOST, PORT))  
sock.listen(5)
addr=(HOST,PORT)
while True:
    print('waiting for connection...')
    sock,addr =sock.accept()
    print('...connected from:',addr)
    while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
sock.close()

客戶端

#coding=utf-8
#創(chuàng)建TCP客戶端

import socket

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE = 1024
ADDR=(HOST,PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) 

while True:
    data = input('> ')
    if not data:
        break
    sock.send(data.encode())
    data = sock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)

sock.close()

執(zhí)行結(jié)果顯示:

首先執(zhí)行服務(wù)器端,結(jié)果如圖1:

在這里插入圖片描述

緊接著執(zhí)行客戶端,如圖2

在這里插入圖片描述

需要注意的是:服務(wù)器端和客戶端需要在兩個IDLE Shell中打開,否則客戶機一啟動,服務(wù)器程序就會中止執(zhí)行,而客戶端又連不上服務(wù)器,從而報錯,如圖3

在這里插入圖片描述

我們在圖2中輸入一些需要傳輸?shù)男畔?,然后回車,在服?wù)端可以看到收到了相關(guān)信息,如圖4(客戶端發(fā)送信息),圖5(服務(wù)器端接收信息)

在這里插入圖片描述
在這里插入圖片描述

源代碼解析

我們從服務(wù)器端開始看起,先上一部分代碼:

import socket
import time
from time import ctime

這三句是導入了三個模塊,分別是socket 模塊、time模塊和ctime模塊。

1)socket 模塊當中提供了與socket 套接字相關(guān)的各項功能,后面用到了很多,這里先介紹一個,其他一會再介紹:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

功能:創(chuàng)建套接字,并把創(chuàng)建好的套接字賦給一個變量sock,下面程序中與套接字相關(guān)的操作都由sock來完成。

格式:socket.socket([family[, type[, proto]]])

參數(shù):

family: 套接字家族,可以使 AF_UNIX 或者 AF_INET。AF_INET,是指面向網(wǎng)絡(luò)的,因特網(wǎng);AF_UNIX,基于文件的;在本例中,我們使用AF_INET,利用因特網(wǎng)來進行通信。

type: 套接字類型,可以根據(jù)是面向連接的還是非連接分為 SOCK_STREAM 或 SOCK_DGRAM。

SOCK_STREAM:對應(yīng)著TCP,提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復的發(fā)送且按發(fā)送順序接收。內(nèi)設(shè)置流量控制,避免數(shù)據(jù)流淹沒慢的接收方。數(shù)據(jù)被看作是字節(jié)流,無長度限制。

SOCK_DGRAM:對應(yīng)著UDP,提供無連接服務(wù)。數(shù)據(jù)包以獨立數(shù)據(jù)包的形式被發(fā)送,不提供無差錯保證,數(shù)據(jù)可能丟失或重復,順序發(fā)送,可能亂序接收。

本例中選TCP協(xié)議。

protocol: 一般不填默認為 0。

2)time模塊,完成python中與時間相關(guān)的計算,例如time.sleep(5)延時5秒,time time() 返回當前時間的時間戳等等。
下面的ctime也是其中一個功能,函數(shù)把一個時間戳(按秒計算的浮點數(shù))轉(zhuǎn)化為time.asctime()的形式,可以便于我們觀察。轉(zhuǎn)換以后的格式如下:

print “time.ctime() : %s” % time.ctime()

結(jié)果:time.ctime() : Tue Feb 17 10:00:18 2013

在我們的例子中,圖4的圈2所表示的就是轉(zhuǎn)換后的時間。

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE=1024
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.bind((HOST, PORT))  
sock.listen(5)
addr=(HOST,PORT)

看完頭部之后,我們來看第二部分。

前三句定義了三個變量:HOST、PORT、BUFSIZE,這三個變量分別是服務(wù)器的IP地址,服務(wù)器的端口,接收的最大數(shù)據(jù)量。

第四句sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 定義了socket 套接字。

第五句sock.bind((HOST, PORT)),將IP地址和端口綁定給定義的套接字sock。

第六句sock.listen(5),開始 TCP 監(jiān)聽。中間的5表示在拒絕連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量。該值至少為 1,大部分應(yīng)用程序設(shè)為 5 就可以了。

第七句addr=(HOST,PORT),定義了一個變量addr,并且將地址以元組的形式賦值給addr。

while True:
    print('waiting for connection...')
    sock,addr =sock.accept()
    print('...connected from:',addr)
    while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
        sock.close()
sock.close()

這是服務(wù)器代碼的最后一部分,也是通信的主體,首先進入一個while True:的永真循環(huán),進入之后執(zhí)行print(‘waiting for connection…'),這就是圖1上藍色字所表示的一部分。

第三行執(zhí)行sock,addr =sock.accept(),sock.accept()是被動接受TCP客戶端連接,(阻塞式)等待連接的到來,當客戶機啟動提交請求后,服務(wù)器接受請求,并將客戶端的IP地址等信息存入變量addr中。

第四行執(zhí)行print('…connected from:',addr),所以輸入字符串…connected from:以及客戶端傳來的IP地址和端口。

以上服務(wù)器和客戶端的通信就連接起來了。

下面開始傳送數(shù)據(jù),又進入一個永真循環(huán),代碼:

  while True:
        data =sock.recv(BUFSIZE).decode()
        print('date=',data)
        if not data:
            break
        sock.send(('[%s] %s' %(ctime(),data)).encode())
        sock.close()

第二行:data =sock.recv(BUFSIZE).decode()。

sock.recv()表示接收 TCP 數(shù)據(jù),數(shù)據(jù)以字符串形式返回,BUFSIZE指定要接收的最大數(shù)據(jù)量。

decode() 將其他編碼的字符串解碼成unicode格式。

這里要說明一下,上圖:

在這里插入圖片描述

字符串在python內(nèi)部是用unicode編碼來表示,而在硬盤是utf-8格式。所以在存儲和使用時要進行格式轉(zhuǎn)換,轉(zhuǎn)換的方式:

decode 將其他編碼的字符串(例如utf-8)解碼成unicode格式。

encode 將unicode編碼成另一種編碼格式(例如utf-8)。

當然decode和encode 不止可以轉(zhuǎn)換utf-8類型,轉(zhuǎn)換的類型可以通過 encoding 來指定,不過我們常用的就是這個。

總結(jié)一下,data =sock.recv(BUFSIZE).decode()執(zhí)行結(jié)束就表示把客戶端的數(shù)據(jù)接收過來存放到了data這個變量中。

下面進行第三行print(‘date=',data),打印數(shù)據(jù),結(jié)果就是圖5中的圈3所表示的。

第四行及第五行: 如果沒有接收到數(shù)據(jù),則跳出循環(huán),繼續(xù)監(jiān)聽。

if not data:
break

第六行 sock.send(('[%s] %s' %(ctime(),data)).encode()),向客戶端發(fā)送轉(zhuǎn)換格式(encode)后的數(shù)據(jù)。

數(shù)據(jù)包括兩部分,第一部分是ctime(),表示以字符串形式表示的時間,data表示變量中存的信息.前面還有一部分'[%s] %s'中的%s格式化字符串,形成需要的輸出格式。

最后一句sock.close(),關(guān)閉套接字。

這樣服務(wù)器端就完成了。我們再來看客戶端。

import socket

HOST = '127.0.0.1'
PORT = 8080
BUFSIZE = 1024
ADDR=(HOST,PORT)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT)) 

這部只解釋幾句,HOST = ‘127.0.0.1' ,PORT = 8080,這兩句是服務(wù)器端的IP地址和端口號。

sock.connect((HOST, PORT)) 這一句是利用創(chuàng)建好的socket套接字主動初始化TCP服務(wù)器連接,就是向服務(wù)器提出申請,服務(wù)器端用sock.accept()接受請求。

這一句執(zhí)行完之后,通信就建立起來了,在服務(wù)器端會執(zhí)行print('…connected from:',addr),結(jié)果如圖5圈2所示。

while True:
    data = input('> ')
    if not data:
        break
    sock.send(data.encode())
    data = sock.recv(BUFSIZE).decode()
    if not data:
        break
    print(data)
sock.close()

接下來進入永真循環(huán),先是input函數(shù),輸出> 后等待輸入,如圖2所示。例如輸入hi,server,如圖4的圈1,然后后兩句是

if not data:
break

如果沒有輸入,則跳出循環(huán)。

第五行sock.send(data.encode()),將輸入的數(shù)據(jù)轉(zhuǎn)換格式后將數(shù)據(jù)發(fā)送給服務(wù)器端,這時把hi,server發(fā)送給服務(wù)器端,服務(wù)器用data =sock.recv(BUFSIZE).decode()來接收,同時用print(‘date=',data)打印出來,結(jié)果如5的圈3所示。

這時,服務(wù)器會繼續(xù)執(zhí)行sock.send(('[%s] %s' %(ctime(),data)).encode()),把當前的時間和數(shù)據(jù)發(fā)送給客戶端。

而在客戶端,執(zhí)行data = sock.recv(BUFSIZ).decode(),所以客戶端會接收到相應(yīng)的數(shù)據(jù),并且打印出來,結(jié)果如圖4的圈2所示。

以上就是Socket套接字的TCP通信。

到此這篇關(guān)于python基礎(chǔ)之Socket套接字詳解的文章就介紹到這了,更多相關(guān)python Socket詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python常用模塊之requests模塊用法分析

    Python常用模塊之requests模塊用法分析

    這篇文章主要介紹了Python常用模塊之requests模塊用法,結(jié)合實例形式分析了Python使用requests模塊發(fā)送GET、POST請求及響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • Python小知識之幾種推導式用法示例

    Python小知識之幾種推導式用法示例

    Python推導式是一種獨特的數(shù)據(jù)處理方式,可以從一個數(shù)據(jù)序列構(gòu)建另一個新的數(shù)據(jù)序列的結(jié)構(gòu)體,下面這篇文章主要給大家介紹了關(guān)于Python小知識之幾種推導式用法的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python爬蟲之異常捕獲及標簽過濾詳解

    python爬蟲之異常捕獲及標簽過濾詳解

    今天帶大家了解python異常捕獲及標簽過濾,文中有非常詳細的代碼示例,對正在學習python爬蟲的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • python廣度搜索解決八數(shù)碼難題

    python廣度搜索解決八數(shù)碼難題

    這篇文章主要介紹了python廣度搜索解決八數(shù)碼難題。想了解算法和數(shù)據(jù)結(jié)構(gòu)的同學,一定要看一下
    2021-04-04
  • 在Python中使用異步Socket編程性能測試

    在Python中使用異步Socket編程性能測試

    異步網(wǎng)絡(luò)據(jù)說能極大的提高網(wǎng)絡(luò)server的連接速度,所以打算寫一個專題,來學習和了解異步網(wǎng)絡(luò).因為Python有個非常出名的異步Lib:Twisted,所以就用Python來完成.
    2014-06-06
  • NCCL深度學習之初始化及ncclUniqueId的產(chǎn)生源碼解析

    NCCL深度學習之初始化及ncclUniqueId的產(chǎn)生源碼解析

    這篇文章主要為大家介紹了NCCL源碼解析之初始化及ncclUniqueId的產(chǎn)生詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Python 多張圖片合并成一個pdf的參考示例

    Python 多張圖片合并成一個pdf的參考示例

    最近需要將記的筆記整理成一個pdf進行保存,所以就研究了一下如何利用 Python 代碼將拍下來的照片整個合并成一個pdf
    2021-06-06
  • 如何使用python計算復雜三角函數(shù)

    如何使用python計算復雜三角函數(shù)

    當涉及到計算復雜的三角函數(shù)時,Python 提供了強大的數(shù)學庫和函數(shù)來幫助我們進行計算,在本篇博客中,我將介紹如何使用 Python 來計算復雜的三角函數(shù),需要的朋友可以參考下
    2023-08-08
  • python實現(xiàn)AI聊天機器人詳解流程

    python實現(xiàn)AI聊天機器人詳解流程

    事情是這樣的,最近認識的一位小姐姐有每天早晨看天氣預報的習慣。在我看來,很多人起床第一件事情就是看微信消息,既然這樣,我就勉為其難每天早晨給小姐姐發(fā)送一則天氣預報吧
    2021-11-11
  • Flask框架Flask-Login用法分析

    Flask框架Flask-Login用法分析

    這篇文章主要介紹了Flask框架Flask-Login用法,結(jié)合實例形式分析了Flask-Login插件進行登錄驗證的相關(guān)操作技巧與注意事項,需要的朋友可以參考下
    2018-07-07

最新評論

白银市| 岢岚县| 永新县| 荔浦县| 内黄县| 吴旗县| 阿坝县| 罗甸县| 府谷县| 白玉县| 绥滨县| 宣城市| 玉树县| 汉阴县| 沾益县| 公主岭市| 墨脱县| 哈巴河县| 德安县| 广饶县| 宁远县| 合山市| 盐源县| 伊川县| 石家庄市| 尚义县| 绿春县| 肥乡县| 武川县| 甘肃省| 磴口县| 长顺县| 福州市| 阜平县| 襄汾县| 青川县| 新乡县| 盐亭县| 泾川县| 旺苍县| 高平市|