模組socket使用

2022-02-09 08:57:41 字數 2597 閱讀 8640

什麼是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 套...