什麼是socket:socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。我們無需再去深入理解tcp/udp協議,按照socket的規定去使用就行了。
首先乙個c/s架構:分為兩部分,服務端,客戶端 (講解基於tcp協議,傳輸資料)
服務端是怎麼設定的呢
import socket #首先匯入socket模組
server = socket.socket(socket.af_inet,socket.sock_stream) #這是獲取tcp套接字(流式協議)
# server = socket.socket(socket.af_inet,socket.sock_dgram) #這是獲取udp套接字
server.bind(('127.0.0.1',8080)) #然後就是繫結伺服器的ip和埠,記住bind()括號裡加(ip,埠) 是乙個元組形式的
server.listen(5) #括號是監聽數,比如我們設定為5,當服務端正在跟五個客戶端通訊時,再來乙個客戶端,那個客戶 端就會連線不進去。
# a = server.accept() #這裡就是等待著客戶端連線,當有客戶端連線時 a = (乙個具有客戶端到服務端和乙個服務端到客戶端的套接字,客戶端的ip和埠) a 是乙個元組型別的資料,我們可以通過解壓的方式,分別講他們賦值給conn和client_addr 也就是以下的**
conn,client_addr = server.accept() # 我們可以通過這個coon 跟客戶端收發資訊,這是
data = conn.recv(1024) #這是收取客戶端的資訊,1024代表一次性接收最大是1024位元組的資料。將接收的資訊賦值給data 記住data 現在是二進位制型別資料
conn.send(data.upper()) #這裡我們將接收的資料大寫形式傳送過去。 你也可以傳送其他資料過,這只是一種例子而已。發過去的資料沒有大小的限制。但是注意接收一次性最多接收1024大小的位元組。
conn.close() #通訊結束了的話,記得關閉conn這個套接字。這個f.open() 記得f.close()是差不多的
server.close() #關閉服務端。嚴格來說服務端的作用就是一直對外開放服務的,一般來說不用關閉。
下面是客戶端的搭建,其方法和服務端一樣的
import socket
client = socket.socket() #這裡括號裡不填的話,就是預設tcp協議(流式協議),前面服務端也是一樣。
client.connect(('127.0.0.1',8080)) #這裡就是直接去連線服務端。記住ip和埠是元組形式。
client.send('你好呀,我是客戶端'.encode('utf-8')) #記住你發過的資料必須是二進位制。可以通過encode('utf-8')轉換
data = client.recv(1024) #收到服務端的資訊
print(data.deconde('utf-8')) 列印資訊
client.close() 關閉客戶端
以上就是通過socket模組搭建的c/s架構(基於tcp協議)
udp協議理論方法是一樣的。我就不一一介紹了。
上面就是乙個最基本的c/s架構。但是健壯性可能不太行。我們可以通過在上面模板在上面增加**。
隱藏錯誤1:客戶端和服務端兩者都建立的連線,如果客戶端這邊出於某種不正常斷開的話,那麼服務端的就是崩掉。
解決方法一:就是通過捕捉異常的方式。
try:
data = conn.recv(1024)
conn.send(data.upper())
except connectionreseterror:
break
解決方式二:其實在windows系統下,解決方式一就夠了,但是我們以後還會在linux在執行,所以說呢,在解決方式二就使用於linux系統,我們寫這個windows的時候也沒有影響,防止以後再linux下出錯了。
基於上面的改進,以後就寫這種
try:
data = conn.recv(1024) #正常情況(客戶端沒有意外斷開,能正常和服務端通訊),data 永遠不會接收到空值,他只會接收有大小的資料。 注意!!!
if not data : break #只有在客戶端意外斷開後,在linux系統下才會執行這段**,正常情況是不會執行的。
conn.send(data.upper())
except connectionreseterror:
break
基於解決方法二,我有一點強調的寫在上面。
隱藏錯誤2 :客戶端不能輸入空,這樣會導致服務端接收不到資料,在那裡一直等著,客戶端雖然發出了資料,但接收資料狀態永遠接收不到值。會一直在那裡等待服務端的發過來的資料。你可以基於上面的模板去試試。
解決方式很簡單,就是不讓客戶端傳送空值就行了,就是多加了一條判斷語句。
msg = input('客戶端要傳送到內容').strip()
if not msg : continue #基於可迴圈通訊,也就是客戶端收發資訊在乙個while迴圈裡。前面服務端可以這樣
這就是幾個會出現的小錯誤和解決的方案。
python使用socket模組進行網路程式設計
python標準庫提供了socket模組用於建立伺服器與客戶端,並且可以相互通訊。伺服器端建立起乙個socket物件,並等待客戶端連線。客戶端使用socket物件與伺服器連線,連線成功就可以進行相互通訊 即傳輸資料 socket模組的socket物件是socket網路程式設計的基礎物件,其原型為 s...
網路模組socket
udp協議 情況 server 建立乙個udp協議的伺服器 import socket sk socket.socket type socket.sock dgram 例項化乙個socket物件 sk.bind 127.0.0.1 8081 給伺服器繫結乙個ip和埠 conn,addr sk.rec...
socket學習 一 socket模組屬性
屬性名稱 描述資料屬性 af unix af inet af inet6 af netlink af tipc python 中支援的套接字位址家族 so stream so dgram 套接字型別 tcp 流,udp 資料報 has ipv6 指示是否支援 ipv6 的布林標記 異常error 套...