socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。
socket模板已經為我們封裝好了,我們只需要遵循socket的規定去程式設計,寫出的程式自然就是遵循tcp/udp標準的。
s都為通過socket模組生成
方法import socket
# socket_family 可以是 af_unix 或 af_inet。socket_type 可以是 sock_stream 或 sock_dgram。protocol 一般不填,預設值為 0
socket.socket(socket_family, socket_type, protocal=0)
# 獲取tcp/ip套接字
tcpsock = socket.socket(socket.af_inet, socket.sock_stream)
# 獲取udp/ip套接字
udpsock = socket.socket(socket.af_inet, socket.sock_dgram)
# 由於 socket 模組中有太多的屬性。我們在這裡破例使用了'from module import *'語句。使用 'from socket import *',我們就把 socket 模組裡的所有屬性都帶到我們的命名空間裡了,這樣能大幅減短我們的**
s = socket(af_inet, sock_stream)
用途s.bind()
繫結(主機,埠號)到套接字 注:(127.0.0.1)表示本地ip
s.listen()
開始tcp監聽
s.accept()
被動接受tcp客戶的連線,(阻塞式)等待連線的到來
方法用途
s.connect()
主動初始化tcp伺服器連線
s.connect_ex()
connect()函式的擴充套件版本,出錯時返回出錯碼,而不是丟擲異常
方法用途
s.recv()
接收tcp資料
s.send()
傳送tcp資料(send在待傳送資料量大於己端快取區剩餘空間時,資料丟失,不會發完)
s.sendall()
傳送完整的tcp資料(本質就是迴圈呼叫send,sendall在待傳送資料量大於己端快取區剩餘空間時,資料不丟失,迴圈呼叫send直到發完)
s.recvfrom()
接收udp資料
s.sendto()
傳送udp資料
s.getpeername()
連線到當前套接字的遠端的位址
s.getsockname()
當前套接字的位址
s.getsockopt()
返回指定套接字的引數
s.setsockopt()
設定指定套接字的引數
s.close()
關閉套接字
方法用途
s.setblocking()
設定套接字的阻塞與非阻塞模式
s.settimeout()
設定阻塞套接字操作的超時時間
s.gettimeout()
得到阻塞套接字操作的超時時間
方法用途
s.fileno()
套接字的檔案描述符
s.makefile()
建立乙個與該套接字相關的檔案
import socket
#1、買手機
phone = socket.socket(socket.af_inet,
socket.sock_stream) #tcp稱為流式協議,udp稱為資料報協議sock_dgram
# print(phone)
#2、插入/繫結手機卡
# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
phone.bind(('127.0.0.1', 8080))
#3、開機
phone.listen(5) # 半連線池,限制的是請求數
#4、等待**連線
print('start....')
while true: # 連線迴圈
conn, client_addr = phone.accept() #(三次握手建立的雙向連線,(客戶端的ip,埠))
# print(conn)
print('已經有乙個連線建立成功', client_addr)
#5、通訊:收\發訊息
while true: # 通訊迴圈
try:
print('服務端正在收資料...')
data = conn.recv(1024) #最大接收的位元組數,沒有資料會在原地一直等待收,即傳送者傳送的資料量必須》0bytes
# print('===>')
if len(data) == 0: break #在客戶端單方面斷開連線,服務端才會出現收空資料的情況
print('來自客戶端的資料', data)
conn.send(data.upper())
except connectionreseterror:
break
#6、掛掉**連線
conn.close()
#7、關機
phone.close()
import socket
#1、買手機
phone = socket.socket(socket.af_inet, socket.sock_stream)
# print(phone)
#2、撥**
phone.connect(('127.0.0.1', 8080)) # 指定服務端ip和埠
#3、通訊:發\收訊息
while true: # 通訊迴圈
msg = input('>>: ').strip() #msg=''
if len(msg) == 0: continue
phone.send(msg.encode('utf-8'))
# print('has send----->')
data = phone.recv(1024)
# print('has recv----->')
print(data)
#4、關閉
phone.close()
基於TCP協議的套接字程式設計
基於socket通訊的內部演算法,當傳送的訊息為空的時候,接收端不會收到訊息,而傳送端向下執行到recv,兩端出於僵持狀態。所以在傳送端需要有個判斷,如果傳送的為空,則重新輸入傳送內容。socket是應用層與tcp ip協議通訊的中間軟體抽象層,它是一組介面。import socket 買手機 ph...
基於tcp協議的套接字
簡單版本 一 服務端 import socket 1 買手機 拿到套接字物件,用來鏈結建立鏈結 phone socket.socket socket.af inet,socket.sock stream tcp稱為流式協議sock stream,udp稱為資料報協議sock dgram print ...
基於tcp的套接字程式設計
伺服器端 1 author kelvin2 date 2019 1 28 22 10 3from socket import 4 server socket.socket af inet,sock stream 5 server.setsockopt sol socket,so reuseaddr,...