Python日常學習之Socket詳細解析

2021-09-14 01:46:53 字數 2516 閱讀 9906

前言  

在python學習中socket相信大家都不會陌生,因為是是乙個介面通道,裡面不僅封裝了ip位址還有埠協議等,下面本文就socket做乙個比較詳細的講解,廢話不多說我們開始吧。

正文socket基礎

什麼是socket?

- socket為介面通道,內部封裝了ip位址、埠、協議等資訊;我們可以看作是以前的通過**機撥號上網的年代,socket即為**線。

socket通訊流程

我們通過下面的圖來了解socket的通訊流程

流程描述:

socket 方法

sk.listen(backlog)

#開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。

#backlog等於5,表示核心已經接到了連線請求,但伺服器還沒有呼叫accept進行處理的連線個數最大為5

#這個值不能無限大,因為要在核心中維護連線佇列

sk.setblocking(bool)

#是否阻塞(預設true),如果設定false,那麼accept和recv時一旦無資料,則報錯。

sk.accept()

#接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的位址。

#接收tcp 客戶的連線(阻塞式)等待連線的到來

sk.connect(address)

#連線到address處的套接字。一般,address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。

sk.connect_ex(address)

#同上,只不過會有返回值,連線成功時返回 0 ,連線失敗時候返回編碼,例如:10061

sk.close()

#關閉套接字

sk.recv(bufsize[,flag])

#接受套接字的資料。資料以字串形式返回,bufsize指定最多可以接收的數量。flag提供有關訊息的其他資訊,通常可以忽略。

sk.recvfrom(bufsize[.flag])

#與recv()類似,但返回值是(data,address)。其中data是包含接收資料的字串,address是傳送資料的套接字位址。

sk.send(string[,flag])

#注意send傳送的資料必須為byte

#將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部傳送。

sk.sendall(string[,flag])

#將string中的資料傳送到連線的套接字,但在返回之前會嘗試傳送所有資料。成功返回none,失敗則丟擲異常。

#內部通過遞迴呼叫send,將所有內容傳送出去。

sk.sendto(string[,flag],address)

#將資料傳送到套接字,address是形式為(ipaddr,port)的元組,指定遠端位址。返回值是傳送的位元組數。該函式主要用於udp協議。

sk.settimeout(timeout)

#設定套接字操作的超時期,timeout是乙個浮點數,單位是秒。值為none表示沒有超時期。一般,超時期應該在剛建立套接字時設定,因為它們可能用於連線的操作(如 client 連線最多等待5s )

sk.getpeername()

#返回連線套接字的遠端位址。返回值通常是元組(ipaddr,port)。

sk.getsockname()

#返回套接字自己的位址。通常是乙個元組(ipaddr,port)

sk.fileno()

#套接字的檔案描述符

簡單實現兩端聊天

------------------伺服器端------------------

import socket

sk = socket.socket()

address = (『127.0.0.1』,8000)

sk.bind(address)

sk.listen(5)

print(『server is waiting…』)

conn,addr = sk.accept()

inp = input(』>>>』)

conn.send(bytes(inp,『utf-8』))

-------------------客戶端-------------------

import socket

sk = socket.socket()

address = (『127.0.0.1』,8000)

sk.connect(address)

data = sk.recv(1024)

print(str(data,『utf-8』))

上述例子,我們實現了服務端與客戶端的連線,並進行了聊天;

Python學習日常

python range 函式可建立乙個整數列表,一般用在 for 迴圈中。語法 range start,stop,step 引數說明 start 計數從 start 開始。預設是從 0 開始。例如range 6 等價於range 0,6 stop 計數到 stop 結束,但不包括 stop。例如 ...

python日常學習

1 python title 方法返回 標題化 的字串,就是說所有單詞都是以大寫開始,其餘字母均為小寫 見 istitle str.title 2 類的繼承 class car def init self,make,model,year self.make make self.model model...

sock程式設計學習2

面向連線的服務sock stream sock seqpacket,在開始交換資料之前,需要在請求服務的程序套接字和提供服務的程序套接字之間建立乙個連線 客戶端通過呼叫connect.int connect int sockfd const struct addr,socklen t len 在co...