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

Python實(shí)現(xiàn)socket庫網(wǎng)絡(luò)通信套接字

 更新時(shí)間:2021年06月04日 09:10:42   作者:一天一篇Python庫  
socket又叫套接字,實(shí)現(xiàn)網(wǎng)絡(luò)通信的兩端就是套接字。分為服務(wù)器對(duì)應(yīng)的套接字和客戶端對(duì)應(yīng)的套接字,本文給大家介紹Python實(shí)現(xiàn)socket庫網(wǎng)絡(luò)通信套接字的相關(guān)知識(shí),包括套接字的基本概念,感興趣的朋友跟隨小編一起看看吧

Socket 套接字:通訊端點(diǎn) 簡(jiǎn)介

socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”,對(duì)于文件用【打開】【讀寫】【關(guān)閉】模式來操作。socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文件,一些socket函數(shù)就是對(duì)其進(jìn)行的操作(讀/寫IO、打開、關(guān)閉)。

Socket 是任何一種計(jì)算機(jī)網(wǎng)絡(luò)通訊中最基礎(chǔ)的內(nèi)容。Socket通訊一般用戶C/S結(jié)構(gòu)系統(tǒng)的網(wǎng)絡(luò)通訊。

Socket 網(wǎng)絡(luò)通訊是基于TCP(傳輸控制協(xié)議)或UDP(用戶數(shù)據(jù)報(bào)協(xié)議)兩種協(xié)議通訊,所以有 面向連接(TCP )與無連接(UDP ) 兩種通訊方式。

Python 要?jiǎng)?chuàng)建TCP 套接字就得在創(chuàng)建的時(shí)候,指定套接字類型為SOCK_STREAM,它使用 TCP/IP通訊協(xié)議。

Socket網(wǎng)絡(luò)通信套接字

socket庫提供了一個(gè)底層C API,可以使用BSD套接字接口實(shí)現(xiàn)網(wǎng)絡(luò)通信。它包括socket類,用于處理具體的數(shù)據(jù)通道,還包括用來完成網(wǎng)絡(luò)相關(guān)任務(wù)的函數(shù),如將一個(gè)服務(wù)器名轉(zhuǎn)換為一個(gè)地址以及格式化數(shù)據(jù)以便在網(wǎng)絡(luò)上發(fā)送。

什么是套接字?

套接字是程序在本地或者通過互聯(lián)網(wǎng)來回傳遞數(shù)據(jù)時(shí)所用通信通道的一個(gè)端點(diǎn)。

套接字有2個(gè)主要屬性用于控制如何發(fā)送數(shù)據(jù):地址簇(address family)控制所用的OSI網(wǎng)絡(luò)層協(xié)議;套接字類型(socket type)控制傳輸層協(xié)議。(參考《計(jì)算機(jī)網(wǎng)絡(luò)》7層協(xié)議)

地址簇

Python支持3個(gè)地址簇:

  • AF_INET:用于IPv4尋址。IPv4長(zhǎng)度為4個(gè)字節(jié),通常表示為4個(gè)數(shù)的序列,每個(gè)字節(jié)對(duì)應(yīng)一個(gè)數(shù),用點(diǎn)號(hào)分割(如121.63.0.243)。這些值通常被稱為IP地址。目前IPv4依舊還是主流。
  • AF_INET6:用于IPv6尋址。目前IPv6已經(jīng)小范圍應(yīng)用,它支持128位地址和通信流調(diào)整,還支持IPv4不支持的一些路由特性。
  • AF_UNIX:用于UNIX域套接字(UDS)的地址簇,這是一種POSIX兼容系統(tǒng)上的進(jìn)程間通信協(xié)議。UDS的實(shí)現(xiàn)通常允許操作系統(tǒng)直接從進(jìn)程向進(jìn)程間傳遞數(shù)據(jù),而不用通過網(wǎng)絡(luò)棧。這比使用AF_INET更高效,但是由于要用到文件系統(tǒng)作為尋址的命令空間,所以UDS僅限于同一個(gè)系統(tǒng)上的進(jìn)程。

套接字類型

套接字類型有兩種:

  • SOCK_DGRAM:面向消息的數(shù)據(jù)報(bào)傳輸,數(shù)據(jù)報(bào)套接字通常與UDP關(guān)聯(lián),即用戶數(shù)據(jù)報(bào)協(xié)議。這些套接字能提供不可靠的消息傳送。
  • SOCK_STREAM:面向流的傳輸,與TCP相關(guān),即傳輸控制協(xié)議。它們可以在客戶和服務(wù)器之間提供字節(jié)流,通過超時(shí)管理,重傳和其他特性確保提供消息傳送或失敗通知。

大多數(shù)應(yīng)用協(xié)議(如HTTP)都建立在TCP基礎(chǔ)上,因?yàn)檫@樣更容易創(chuàng)建自動(dòng)處理消息排序和傳送的復(fù)雜應(yīng)用。

UDP通常用于順序不太重要的協(xié)議(如DNS交換)。UDP與TCP都支持IPv4與IPv6。

套接字的簡(jiǎn)單應(yīng)用

gethostbyname_ex()與gethostbyname()

socket庫包含一些與網(wǎng)絡(luò)上的域名服務(wù)交互的函數(shù),比如解析域名為IP地址可以用到gethostbyname_ex(),示例如下:

import socket

host_str = [
    'www.baidu.com',
    'cloud.tencent.com',
    'www.csdn.net'
]
for host in host_str:
    try:
        name, aliases, addresses = socket.gethostbyname_ex(host)
        print(host)
        print("主機(jī)名:", name)
        print("所有別名:", aliases)
        print("所有可用IP地址:", addresses)
    except socket.error as msg:
        print(host, msg)

運(yùn)行之后,效果如下:

別名

gethostbyname_ex:該函數(shù)返回3個(gè)參數(shù),主機(jī)名,別名,以及解析能跳轉(zhuǎn)到當(dāng)前主機(jī)的IP地址。

gethostbyname:類似的函數(shù),只返回當(dāng)前主機(jī)的IP地址。

getservbyname()與getservbyport()

socket庫提供getservbyname()函數(shù)用于查找網(wǎng)絡(luò)服務(wù)的端口號(hào)和標(biāo)準(zhǔn)名,示例如下所示:

import socket
from urllib.parse import urlparse

url_str = [
    'https://www.baidu.com',
    'https://www.csdn.net',
    'smtp://smtp.qq.com',
]
for url in url_str:
    try:
        parsed_url = urlparse(url)
        port = socket.getservbyname(parsed_url.scheme)
        print(url)
        print("端口號(hào):", port)
    except socket.error as msg:
        print(url, msg)

運(yùn)行之后,效果如下:

端口號(hào)

當(dāng)然,其實(shí)最有用的并不是給定一個(gè)鏈接去查詢端口號(hào),而是逆向操作。(因?yàn)闃?biāo)準(zhǔn)化服務(wù)端口號(hào)一般都是固定的)

socket庫提供getservbyport()函數(shù)用于完成逆向的服務(wù)端口查找,示例代碼如下所示:

import socket

url = '{}://smtp.qq.com'.format(socket.getservbyport(25))
print(url)

運(yùn)行之后,效果如下:

逆向端口號(hào)

getprotobyname()

socket庫還可以使用getprotobyname()函數(shù)獲取分配給一個(gè)傳輸協(xié)議的端口號(hào),示例如下:

import socket

#獲取匹配開頭字符串的所有屬性值
def getConstants(prefix):
    return {
        getattr(socket, n): n
        for n in dir(socket)
        if n.startswith(prefix)
    }
ipproto_str = getConstants("IPPROTO_")
for agree in ['tcp', 'udp']:
    num = socket.getprotobyname(agree)
    name = ipproto_str[num]
    print(name, num)

運(yùn)行之后,效果如下:

示例如上

對(duì)于協(xié)議碼,在程序定義中一般都是標(biāo)準(zhǔn)化常量,這就是意味著,它們的常量名都有一定的規(guī)律,而socket協(xié)議碼前綴是IPPROTO_。

getaddrinfo(查找服務(wù)器地址)

getaddrinfo()函數(shù)用于將一個(gè)服務(wù)的基本地址轉(zhuǎn)換為一個(gè)元組列表,其中包含建立一個(gè)連接所需要的全部信息。比如其網(wǎng)絡(luò)簇與協(xié)議等,示例如下:

import socket

# 獲取匹配開頭字符串的所有屬性值
def getConstants(prefix):
    return {
        getattr(socket, n): n
        for n in dir(socket)
        if n.startswith(prefix)
    }
ipproto_str = getConstants("IPPROTO_")
family_str = getConstants("AF_")
type_str = getConstants("SOCK_")
for response in socket.getaddrinfo('www.csdn.net', 'http', family=socket.AF_INET, type=socket.SOCK_STREAM,
                                   proto=socket.IPPROTO_TCP, flags=socket.AI_CANONNAME):
    family, socktype, ipproto, canonname, sockaddr = response
    print("地址簇:       ", family_str[family])
    print("套接字類型:    ", type_str[socktype])
    print("協(xié)議碼:       ", ipproto_str[ipproto])
    print("主機(jī)規(guī)范名:    ", canonname)
    print("ip地址與端口號(hào):", sockaddr)

運(yùn)行之后,效果如下:

篩選條件

這里如果只用socket.getaddrinfo(‘www.csdn.net', ‘http'),表示不需要過濾任何連接信息,但大型的網(wǎng)站一般都有幾個(gè)IP或者域名跳轉(zhuǎn)到主頁的。

所以通過后面的參數(shù),可以篩選自己需要的鏈接信息。

其中,最后一個(gè)參數(shù)socket.AI_CANONNAME表示如果主機(jī)有別名,那么結(jié)果中會(huì)包含服務(wù)器的標(biāo)準(zhǔn)名。所有沒有這個(gè)標(biāo)志,標(biāo)準(zhǔn)名為空。

IP地址的表示方式

如果讀者有C的經(jīng)驗(yàn),那么肯定知道,通過C語言編寫的套接字程序是使用struct sockaddr結(jié)構(gòu)體,它將IP地址表示為二進(jìn)制,而不是上面顯示的Python字符串形式。

如果想在Python和C之間轉(zhuǎn)換IPv4地址,可以使用inet_aton()和inet_ntoa()。示例如下:

import socket
import binascii

ip_list = [
    "192.168.50.1",
    "127.0.0.1"
]
for ip in ip_list:
    packed = socket.inet_aton(ip)
    print("原始字符串ip地址:", ip)
    print("C庫能識(shí)別的ip地址", binascii.hexlify(packed))
    print("還原C庫ip地址字符串", socket.inet_ntoa(packed))
    print()

運(yùn)行之后,效果如下:

效果圖

inet_pton()與inet_ntop()

相信讀者如果在測(cè)試上面代碼,那么輸入上面inet_aton()函數(shù)時(shí),一定看到提醒中還有inet_pton()與inet_ntop()函數(shù)。

這2個(gè)函數(shù)既能處理IPv4也能處理IPv6,而inet_aton()和inet_ntoa()只能處理IPv4。它們的使用方式如下:

import socket
import binascii

ipv6_str = "2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b"
packed = socket.inet_pton(socket.AF_INET6, ipv6_str)
print("原始字符串ip地址:", ipv6_str)
print("C庫能識(shí)別的ip地址", binascii.hexlify(packed))
print("還原C庫ip地址字符串", socket.inet_ntop(socket.AF_INET6, packed))
print()

ipv4_str = "192.168.50.1"
packed = socket.inet_pton(socket.AF_INET, ipv4_str)
print("原始字符串ip地址:", ipv4_str)
print("C庫能識(shí)別的ip地址", binascii.hexlify(packed))
print("還原C庫ip地址字符串", socket.inet_ntop(socket.AF_INET, packed))
print()

運(yùn)行之后,效果如下:

IPV6

以上就是Python實(shí)現(xiàn)socket庫網(wǎng)絡(luò)通信套接字的詳細(xì)內(nèi)容,更多關(guān)于Python socket庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中str字符串的內(nèi)置方法詳解

    Python中str字符串的內(nèi)置方法詳解

    這篇文章主要介紹了Python中str字符串的內(nèi)置方法詳解,在?python?中字符串有許多內(nèi)置的方法,在日常編程中會(huì)經(jīng)常使用到,熟練運(yùn)用了能夠在很多場(chǎng)景大大的提高我們的工作效率,需要的朋友可以參考下
    2023-08-08
  • 詳解Python中Pygame鍵盤事件

    詳解Python中Pygame鍵盤事件

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著Pygame鍵盤事件展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python自然語言處理庫之NLTK庫初級(jí)教程

    Python自然語言處理庫之NLTK庫初級(jí)教程

    NLTK(Natural Language Toolkit)是一個(gè)Python庫,用于實(shí)現(xiàn)自然語言處理(NLP)的許多任務(wù),NLTK包括一些有用的工具和資源,如文本語料庫、詞性標(biāo)注器、語法分析器等,在這篇初級(jí)教程中,我們將了解NLTK的基礎(chǔ)功能,需要的朋友可以參考下
    2023-08-08
  • Python報(bào)錯(cuò)TypeError: object of type ‘generator‘ has no len ()的解決方法

    Python報(bào)錯(cuò)TypeError: object of type ‘gener

    在Python開發(fā)的復(fù)雜世界中,報(bào)錯(cuò)信息就像神秘的謎題,困擾著開發(fā)者和環(huán)境配置者,其中,TypeError: object of type ‘generator’ has no len()這個(gè)報(bào)錯(cuò),常常在不經(jīng)意間打亂我們的開發(fā)節(jié)奏,本文讓我們一起深入探究這個(gè)報(bào)錯(cuò)問題,為Python開發(fā)之路掃除障礙
    2024-10-10
  • python刪除csv文件的行列

    python刪除csv文件的行列

    這篇文章主要介紹了python刪除csv文件中的某幾列或行,主要介紹了python對(duì)csv刪除的方法,感興趣的同學(xué)可以參考學(xué)習(xí)
    2021-04-04
  • 如何使用pdb進(jìn)行Python調(diào)試

    如何使用pdb進(jìn)行Python調(diào)試

    本篇教程中,我們主要講解了pdb中一些基本常用的內(nèi)容,包括打印表達(dá)式使用n(next)和s(step)命令調(diào)試代碼斷點(diǎn)使用unt(until)來繼續(xù)執(zhí)行代碼顯示表達(dá)式查找一個(gè)函數(shù)的調(diào)用者,對(duì)pdb Python調(diào)試相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-06-06
  • Python異常處理總結(jié)

    Python異常處理總結(jié)

    這篇文章主要介紹了Python異常處理總結(jié),需要的朋友可以參考下
    2014-08-08
  • python 函數(shù)的詳解與應(yīng)用范例

    python 函數(shù)的詳解與應(yīng)用范例

    函數(shù)是組織好的,可重復(fù)使用的,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶自定義函數(shù)
    2021-11-11
  • pandas與pyspark計(jì)算效率對(duì)比分析

    pandas與pyspark計(jì)算效率對(duì)比分析

    這篇文章主要介紹了pandas與pyspark計(jì)算效率對(duì)比,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Python3.5.3下配置opencv3.2.0的操作方法

    Python3.5.3下配置opencv3.2.0的操作方法

    下面小編就為大家分享一篇Python3.5.3下配置opencv3.2.0的操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評(píng)論

禹州市| 东安县| 上栗县| 博白县| 本溪| 浏阳市| 临城县| 仙居县| 科尔| 敖汉旗| 郯城县| 盱眙县| 满城县| 昌邑市| 伊金霍洛旗| 肇源县| 孙吴县| 逊克县| 山东| 河津市| 莆田市| 子洲县| 万盛区| 天全县| 韶山市| 马公市| 无为县| 呼和浩特市| 兴城市| 永川市| 长泰县| 班戈县| 泰来县| 湘潭市| 潼关县| 唐河县| 合作市| 河东区| 南充市| 探索| 双峰县|