1. 程式人生 > >[ python ] 網路程式設計(1)

[ python ] 網路程式設計(1)

在本地電腦上有兩個python檔案 regist.py 、login.py 一個註冊,一個登入。這兩個python一個是寫使用者資訊,一個是讀使用者資訊,要怎麼做呢?

通過之前的知識,我們可以通過 regist.py 序列化一個數據並持久儲存到磁碟上,然後 login.py 在取讀取這個檔案就行。

 

但是,當這兩個檔案在不同的主機上時,我們就需要通過網路程式設計來實現,類似qq、網盤、微信。

 

osi 七層協議

 

在這七層中,我們應該明確:

每層執行常用物理裝置:

每層執行常見的協議

 

要記牢:ip是在網路層,tcp、udp等協議是在傳輸層。

 

socket概念

 

 

理解 socket

從表現形式來講,socket就是 ip:port,從設計模式來講,socket其實就是一個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。

從python的角度來看,socket就是一個模組,我們通過呼叫模組中已經實現的方法建立兩個程序之間的連線和通訊。socket = ip:port  ip 用來標識網際網路中的一臺主機的位置,而port是用來標識這臺主機上的一個應用程式,所以我們只要確立了ip和port就能找到一個應用程式,並且使用socket模組來與之通訊。

 

tcp協議與udp協議

tcp( Transmission Control Protocol ): 可靠的、面向連線的協議、傳輸效率低全雙工通訊、面向位元組流。使用tcp應用:web瀏覽器;電子郵件、檔案傳輸程式。
udp( User Datagram Protocol ): 不可靠的、無連線的服務,傳輸效率高,一對一、一對多、多對一、多對多、面向報文,盡最大努力服務,無擁塞控制。
使用udp的應用:域名系統;視訊流;ip語音

 

套接字(socket)使用

1. 基於tcp協議的socket

tcp是基於連結的,必須先啟動服務端,然後再啟動客戶端去連線服務端

sever端

import socket

sock = socket.socket()  # 建立 socket 物件
sock.bind(('127.0.0.1', 8080))  # 繫結ip和port
sock.listen(5)  # 建立監聽連結
conn, addr = sock.accept()  # 阻塞,隨時準備接收客戶端連結
res = conn.recv(1024)   # 阻塞,等待接收客戶端傳送過來的資料
conn.send(b'hello client.') # 向客戶端傳送資訊
conn.close()    # 關閉本次連結
sock.close()    # 關閉伺服器socket

 

 

client端

import socket

sock = socket.socket()  # 建立 socket 物件
sock.connect(('127.0.0.1', 8080))   # 去連線服務端的socket
sock.send(b'hello server.') # 傳送資訊給服務端的socket
res = sock.recv(1024)   # 接收服務端socket傳送過來的資訊
print(res)
sock.close()    # 關閉客戶端連線

 

 

總結:
server端:
(1)建立socket物件
(2)繫結ip:port, 這裡 ip為str型別,port為int型別
(3)建立socket監聽
(4)準備接收客戶端連線並返回socket連線資訊和addr資訊
(5)conn.send 傳送資訊、 conn.recv 接收訊息
(6)先關閉連線,再關閉 socket

 

client端:

(1)建立socket物件
(2)通過 connect 嘗試去連線服務端的socket
(3)sock.send 傳送訊息、sock.recv 接收訊息
(4)關閉連線的socket

 

2. 基於UDP協議的socket

udp是無連結的,啟動服務之後可以直接接受訊息,不需要提前建立連結

server端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)  # 建立一個伺服器的套接字,這裡必須要定義 type=socket.SOCK_DGRAM
udp_sk.bind(('127.0.0.1', 8080))    # 繫結伺服器套接字
msg, addr = udp_sk.recvfrom(1024)   # udp伺服器端第一次通訊必須是接收資訊
print(msg)
udp_sk.sendto(b'hello, client.', addr)  # 傳送資訊
udp_sk.close()  # 關閉伺服器套接字

 



client端

import socket
ip_port = ('127.0.0.1', 8080)   # 建立ip、port元組
udp_sk = socket.socket(type=socket.SOCK_DGRAM)  # 建立一個伺服器的套接字,這裡必須要定義 type=socket.SOCK_DGRAM
udp_sk.sendto(b'hello server.', ip_port)    # 傳送訊息給伺服器端,在udp中第一次互動由客戶端發起
back_msg, addr = udp_sk.recvfrom(1024)  # 接收資料包括(伺服器端資料,套接字資訊)
print(back_msg)
udp_sk.close()  # 關閉套接字