Python基礎之socket程式設計

2022-07-23 06:36:09 字數 3185 閱讀 9841

1、硬體c/s架構(印表機)

2、軟體c/s架構

網際網路中處處是c/s/架構

如各種**的服務端,你的瀏覽器就是客戶端(b/s架構也是c/s/架構的一種)

c/s架構與socket的關係:

我們學習socket就是為了完成c/s架構的開發

為何學習socket一定要先學習網際網路協議:

1、首先:本屆課程的目標就是教會你如何基於socket程式設計,來開發一款自己的c/s/架構軟體

2、其次:c/s架構的軟體(軟體屬於應用層——是基於網路進行通訊的)

3、然後:網路的核心即一堆協議,協議即標準,如果你想開發一款基於網路通訊的軟體,就必須遵循這種標準。

4、最後:就讓我們從這些標準開始研究,開始我們的socket程式設計之旅(如圖)

在上圖中我們沒有看到socket的影子,那麼它到底在哪呢?還是用圖說話,一目了然的呢。

socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

所以,我們無需深入理解tcp/ip協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去程式設計,寫出的程式自然就是遵循tcp/upd標準的。

基於檔案型別的套接字家族  af_unix

unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,;兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊。

基於網路型別的套接字家族  af_inet

af_inet被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,要麼就是一斤乾杯飛起,或者是很少被使用,或者是根本沒有實現,所有位址家族中,af_inet是使用最廣泛的乙個,python支援很多種位址家族,但是由於我們只關心網路程式設計,所以大部分時候我們只使用af_inet.

先從服務端說起。服務端先初始化socket,然後與的埠繫結(bind),對埠進行監聽(listen),呼叫(accept)阻塞,等待客戶端鏈結。在這時如果有個客戶端初始化化乙個socket,然後鏈結拂去其(connect),如果鏈結成功個,這時客戶端與服務端的鏈結就建立了。客戶端傳送資料請求,服務端接受請求並處理請求,然後把回應資料傳送給客戶端,客戶端讀取資料,最後關閉鏈結,一次互動結束。

socket()函式用法

socket.socket([family[,type[,proto]]])
引數:family:套接字家族可以使用af_unix或者af_inet

type:套接字蕾西你給可以根據市面向鏈結的還是非鏈結分為sock_strea或者sock_dgram

protocol:一般不填預設為0

tcp是基於鏈結的,必須先啟動服務端,然後在啟動客戶端去鏈結副區段

socket通訊流程與打**流程類似,我們就以打**為例來實現乙個low版的套接字通訊  

服務端(如下**)

#_*_coding:utf-8_*_

__author__ = 'linhaifeng'

import socket

ip_port=('127.0.0.1',8081)#**卡

bufsize=1024

s=socket.socket(socket.af_inet,socket.sock_stream) #買手機

s.bind(ip_port) #手機插卡

s.listen(5) #手機待機

while true: #新增接收鏈結迴圈,可以不停的接**

conn,addr=s.accept() #手機接**

# print(conn)

# print(addr)

print('接到來自%s的**' %addr[0])

while true: #新增通訊迴圈,可以不斷的通訊,收發訊息

msg=conn.recv(bufsize) #聽訊息,聽話

# if len(msg) == 0:break #如果不加,那麼正在鏈結的客戶端突然斷開,recv便不再阻塞,死迴圈發生

print(msg,type(msg))

conn.send(msg.upper()) #發訊息,說話

conn.close() #掛**

s.close() #手機關機

tcp客戶端

#_*_coding:utf-8_*_

__author__ = 'linhaifeng'

import socket

ip_port=('127.0.0.1',8081)

bufsize=1024

s=socket.socket(socket.af_inet,socket.sock_stream)

s.connect_ex(ip_port) #撥**

while true: #新增通訊迴圈,客戶端可以不斷發收訊息

msg=input('>>: ').strip()

if len(msg) == 0:continue

s.send(msg.encode('utf-8')) #發訊息,說話(只能傳送位元組型別)

feedback=s.recv(bufsize) #收訊息,聽話

print(feedback.decode('utf-8'))

s.close() #掛**

python之 socket 基礎篇

socket 網路模組 注意事項 在python3中,所有資料的傳輸必須用bytes型別 bytes只支援ascii碼 所以在傳送資料的時候要麼在傳送的字串前面加 b 要麼使用encode utf 8 進行轉換成bytes型別傳送,但是在接收端必須用decode 進行轉碼。套接字格式 socket ...

Python 基礎之socket程式設計(三)

python 基礎之socket程式設計 三 前面實現的基於socket通訊只能實現什麼呢?在tcp協議的通訊中就是乙個使用者說一句,服務端給你回一句,你再給服務端說一句,服務端再給你回一句,就這樣一直友好的玩耍下去了。等等,又有乙個使用者來了,他呢也想和和服務端進行一下交流,於是他就給服務端傳送了...

網路基礎之socket

我們知道ip層的ip位址可以唯一標示主機,而tcp層協議和埠號可以唯一標示主機的乙個程序,這樣我們可以利用ip位址 協議 埠號唯一標示網路中的乙個程序。能夠唯一標示網路中的程序後,它們就可以利用socket進行通訊了.什麼是socket呢?我們經常把socket翻譯為套接字,socket是在應用層和...