套接字通訊

2022-03-18 21:43:45 字數 4320 閱讀 5293

套接字家族的名字:af_unix

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

套接字家族的名字:af_inet

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

乙個生活中的場景。你要打**給乙個朋友,先撥號,朋友聽到**鈴聲後提起**,這時你和你的朋友就建立起了連線,就可以講話了。等交流結束,結束通話**結束此次交談。 生活中的場景就解釋了這工作原理。

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

socket()模組函式用法

import socket

socket.socket(socket_family,socket_type,protocal=0)

#socket_family 可以是 af_unix 或 af_inet。socket_type 可以是 sock_stream 或 sock_dgram。protocol

# 一般不填,預設值為 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 模組裡的所有屬性都帶到我們的命名空間裡了,這樣能 大幅減短我們的**。

#例如tcpsock = socket(af_inet, sock_stream

服務端套接字函式s.bind() 繫結(主機,埠號)到套接字

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() 建立乙個與該套接字相關的檔案

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

服務端:

# 服務端應該滿足的特點:

# 1、一直提供服務

# 2、併發地提供服務

import socket

# 1、買手機

phone=socket.socket(socket.af_inet,socket.sock_stream) # 流式協議=》tcp協議

# 2、繫結手機卡

phone.bind(('127.0.0.1',8080)) # 0-65535, 1024以前的都被系統保留使用

# 3、開機

phone.listen(5) # 5指的是半連線池的大小

print('服務端啟動完成,監聽位址為:%s:%s' %('127.0.0.1',8080))

# 4、等待**連線請求:拿到**連線conn

# 加上鏈結迴圈

while true:

conn,client_addr=phone.accept()

# 5、通訊:收\發訊息

while true:

try:

data=conn.recv(1024) # 最大接收的資料量為1024bytes,收到的是bytes型別

if len(data) == 0:

# 在unix系統洗,一旦data收到的是空

break

print("客戶端發來的訊息:",data.decode('utf-8'))

conn.send(data.upper())

except exception:

# 針對windows系統

break

# 6、關閉**連線conn(必選的**資源的操作)

conn.close()

# 7、關機(可選操作)

phone.close()

客戶端:

import socket

#1、買手機

phone=socket.socket(socket.af_inet,socket.sock_stream) # 流式協議=》tcp協議

#2、撥通服務端**

phone.connect(('127.0.0.1',8080))

#3、通訊

while true:

msg=input("輸入要傳送的訊息》: ").strip() #msg=''

if len(msg) == 0:continue

phone.send(msg.encode('utf-8'))

print('*****=?')

data=phone.recv(1024)

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

#4、關閉連線(必選的**資源的操作)

phone.close()

服務端:

import socket

server=socket.socket(socket.af_inet,socket.sock_dgram) # 資料報協議=》udp協議

server.bind(('127.0.0.1',8081))

while true:

data,client_addr=server.recvfrom(1024)

server.sendto(data.upper(),client_addr)

server.close()

客戶端:

import socket

client=socket.socket(socket.af_inet,socket.sock_dgram) # 流式協議=》tcp協議

while true:

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

client.sendto(msg.encode('utf-8'),('127.0.0.1',8081))

res=client.recvfrom(1024)

print(res)

client.close()

套接字通訊

利用三元組 ip位址,協議,埠 就可以標識網路的程序 socket即是一種特殊的檔案,一些socket函式就是對其進行的操作 讀 寫io 開啟 關閉 socket是 open write read close 模式的一種實現,那麼socket就提供了這些操作對應的函式介面 tcp通訊中的socket...

socket 套接字通訊

要通過internet進行通訊,至少需要一對套接字,其中乙個執行在客戶端,稱之為clientsocket,另乙個執行於伺服器端面,稱為serversocket。根據連線啟動的方式以及本地要連線的目標,套接字之間的連線過程可以分為三個步驟 伺服器監聽 客戶端請求 連線確認。伺服器監聽是指服務端套接字並...

Python socket套接字通訊

socket是乙個模組,又稱套接字,用來封裝 網際網路協議 應用層以下的層 socket可以實現網際網路協議 應用層以下的層 的工作,提高開發效率。import socket 寫socket套接字 使用如下 client.py 啟動服務端後再啟動客戶端 import socket 1.買手機 cli...