摘要:可以是主機(jī)名地址或空字符串。如果傳遞空字符串,則服務(wù)器將接受所有可用接口上的連接。應(yīng)為之間的整數(shù)被保留,它是接受來自客戶端連接的端口號(hào),如果端口號(hào),某些系統(tǒng)可能需要超級(jí)用戶權(quán)限。
簡評(píng):我們已經(jīng)從「Python Socket 編程概覽」了解了 socket API 的概述以及客戶端和服務(wù)器的通信方式,接下來讓我們創(chuàng)建第一個(gè)客戶端和服務(wù)器,我們將從一個(gè)簡單的實(shí)現(xiàn)開始,服務(wù)器將簡單地回顯它接收到客戶端的任何內(nèi)容。本文將詳細(xì)解釋服務(wù)器部分的代碼。下面是服務(wù)器代碼保存到 echo-server.py文件:
#!/usr/bin/env python3 import socket HOST = "127.0.0.1" # Standard loopback interface address (localhost) PORT = 65432 # Port to listen on (non-privileged ports are > 1023) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((HOST, PORT)) s.listen() conn, addr = s.accept() with conn: print("Connected by", addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data)
socket.socket()創(chuàng)建一個(gè)支持上下文管理器類型的 socket 對(duì)象,因此可以在 with 語句中使用它,沒有必要去調(diào)用 s.close():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: pass # Use the socket object without calling s.close().
傳遞給socket()的參數(shù)指定地址族和 socket 類型。 AF_INET 指的是 IPv4 的網(wǎng)絡(luò)地址。 SOCK_STREAM是 TCP 的 socket 類型,TCP 用于在網(wǎng)絡(luò)中傳輸消息。
bind()用于將 socket 與特定網(wǎng)絡(luò)接口和端口號(hào)相關(guān)聯(lián):
HOST = "127.0.0.1" # Standard loopback interface address (localhost) PORT = 65432 # Port to listen on (non-privileged ports are > 1023) # ... s.bind((HOST, PORT))
傳遞給bind()的值取決于 socket 的地址族。在這個(gè)例子中,我們使用的是socket.AF_INET(IPv4)所以它接受一個(gè)(host, port)元組。
host 可以是主機(jī)名、IP 地址或空字符串。如果使用 IP 地址,則主機(jī)應(yīng)為 IPv4 格式的地址字符串,127.0.0.1 是環(huán)回接口的標(biāo)準(zhǔn) IPv4 地址,因此只有主機(jī)上的進(jìn)程才能連接到服務(wù)器。如果傳遞空字符串,則服務(wù)器將接受所有可用 IPv4 接口上的連接。
port 應(yīng)為 1-65535 之間的整數(shù)(0 被保留),它是接受來自客戶端連接的 TCP 端口號(hào),如果端口號(hào) <1024,某些系統(tǒng)可能需要超級(jí)用戶權(quán)限。
listen()使服務(wù)器能夠 accept()連接,這使它成為一個(gè)「listening」socket:
s.listen() conn, addr = s.accept()
accept()阻塞并等待傳入請(qǐng)求連接。當(dāng)客戶端連接時(shí),它返回一個(gè)表示連接的 socket 對(duì)象和一個(gè)保存客戶端地址的元組,該元組包含用于 IPv4 連接的(host, port)或用于 IPv6的(host, port, flowinfo, scopeid)。
必須要理解的一件事是我們現(xiàn)在有一個(gè)來自accept()的新 socket 對(duì)象,這很重要,因?yàn)樗怯糜谂c客戶端通信的 socket,它與服務(wù)器用于接受新連接的偵聽 socket 不同:
conn, addr = s.accept() with conn: print("Connected by", addr) while True: data = conn.recv(1024) if not data: break conn.sendall(data)
從accept()獲取客戶端 socket 對(duì)象conn后,使用無限循環(huán)來循環(huán)阻塞對(duì) conn.recv()的調(diào)用。這將讀取客戶端發(fā)送的任何數(shù)據(jù),并使用 conn.sendall()將其回送回來。
如果conn.recv()返回一個(gè)空字節(jié)對(duì)象b"",則客戶端關(guān)閉連接并終止循環(huán)。 with 語句與 conn 一起使用以自動(dòng)關(guān)閉塊末尾的 socket。
原文:Socket Programming in Python (Guide) – Real Python
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42505.html
摘要:本文原發(fā)于個(gè)人博客在英文中的含義為連接兩個(gè)物品的凹槽,像,意為眼窩,此外還有插座的意思。協(xié)議,所是用的傳輸協(xié)議,目前有三種。,也稱為無連接的,使用協(xié)議。當(dāng)函數(shù)返回時(shí),意味著對(duì)端已經(jīng)關(guān)閉。 本文原發(fā)于個(gè)人博客 Socket 在英文中的含義為(連接兩個(gè)物品的)凹槽,像the eye socket,意為眼窩,此外還有插座的意思。在計(jì)算機(jī)科學(xué)中,socket 通常是指一個(gè)連接的兩個(gè)端點(diǎn),這里的...
摘要:當(dāng)一個(gè)客戶端連接時(shí),它將返回一個(gè)新的對(duì)象,對(duì)象中有表示當(dāng)前連接的和一個(gè)由主機(jī)端口號(hào)組成的連接的元組,更多關(guān)于元組值的內(nèi)容可以查看地址族一節(jié)中的詳情這里必須要明白我們通過調(diào)用方法擁有了一個(gè)新的對(duì)象。 博客原文: https://keelii.com/2018/09/24/socket-programming-in-python/ 說明 本書翻譯自 realpython 網(wǎng)站上的文章教程 ...
摘要:中卻發(fā)生了異常。接收數(shù)據(jù)使用函數(shù)接收數(shù)據(jù)在中返回的是對(duì)象,在中返回的是。注意函數(shù)返回的數(shù)據(jù)長度是小于或者等于參數(shù)指定的長度的,要接收到指定長度的數(shù)據(jù),需要循環(huán)接收數(shù)據(jù)。當(dāng)一個(gè)被回收時(shí)會(huì)自動(dòng)關(guān)閉,但是不要依賴這種機(jī)制,不需要時(shí)就主動(dòng)的。 本文介紹使用Python進(jìn)行Socket網(wǎng)絡(luò)編程,假設(shè)讀者已經(jīng)具備了基本的網(wǎng)絡(luò)編程知識(shí)和Python的基本語法知識(shí),本文中的代碼如果沒有說明則都是運(yùn)行在...
摘要:對(duì)于網(wǎng)絡(luò)編程來說,免不了要用到模塊。表示另一端的地址。以上主要是針對(duì)流數(shù)據(jù)的編程。對(duì)于協(xié)議的數(shù)據(jù),處理略有不同。通過傳入對(duì)象調(diào)用來監(jiān)聽對(duì)象的文件描述符,一旦發(fā)現(xiàn)對(duì)象就緒,就通知應(yīng)用程序進(jìn)行相應(yīng)的讀寫操作。 對(duì)于python網(wǎng)絡(luò)編程來說,免不了要用到socket模塊。下面分享一下個(gè)人對(duì)python socket的一些理解。 socket編程步驟 服務(wù)端創(chuàng)建一個(gè)socket,綁定地址和端...
摘要:如果你想體驗(yàn)原味編程,用開頭的比較適合否則建議使用流函數(shù)。有關(guān)流的知識(shí),請(qǐng)參考本人之前的博文回顧之流。接下來我們用流函數(shù)實(shí)現(xiàn)一個(gè)簡單的客戶端和服務(wù)端。流函數(shù)中的和兩個(gè)函數(shù)是我們想要的。本文目的是簡要介紹中的編程,行文到此已經(jīng)達(dá)到目的。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie w...
閱讀 2045·2021-10-08 10:05
閱讀 1886·2021-09-22 15:31
閱讀 3007·2021-09-22 15:13
閱讀 3485·2021-09-09 09:34
閱讀 2081·2021-09-03 10:46
閱讀 3121·2019-08-30 15:56
閱讀 1703·2019-08-30 15:53
閱讀 2356·2019-08-30 15:44