1、簡述socket原理
socket又稱套間字或者插口,是網絡通信中必不可少的工具。有道是:“無socket,不網絡”。由於socket最早在BSD Unix上使用,而Unix/Linux所奉為經典的至高哲學是“一切皆是文件”。因此socket在使用時也是完全符合這個哲學的,它涉及到listen()、bind()、accept()、write()/read()、close()等基本的類似於文件操作的功能函數。
上述Socket功能函數是從傳輸層協議TCP或者UDP中抽象出來的,一個基本的socket通信可以通過固定的功能函數實現。這里插一句,IP協議是工作在網絡層的。
2、socket通信創建過程(以客戶端為例)
首先:創建Socket,涉及到的主要參數有:domain、type、protocal。
domain是協議域,其中AF_INET->IPv4;AF_INET6->IPv6 。
type對應socket類型,SOCK_STREAM->TCP;SOCK_DGRAM->UDP。
protocol是IPPROTO_TCP,若傳入0,則會根據第二個參數type,自動選擇合適的參數。
其次,連接到服務器,主要參數:
客戶端socket
指向數據結構socketaddr的指針,其中包括目的端口和IP地址
結構體數據長度
再次,發送數據到服務器,主要參數:
客戶端socket
發送內容地址
發送內容長度
發送方式標志,一般為0
又再次,從服務器接受數據,主要參數:
客戶端socket
接受內容緩沖區地址
接受內容緩沖區長度
接受方式,0表示阻塞,必須等待服務器返回數據返回值,若成功,則返回讀入的字節數,失敗則 返回SOCKET_ERROR。
最后,關閉socket即可。
3、python 實現socket通信代碼實例
首先,服務器端:
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()
print('...connnecting from:', addr)
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
#tcpCliSock.send('[%s] %s' %(bytes(ctime(),'utf-8'),data))
tcpCliSock.send(('[%s] %s' % (ctime(), data)).encode())
tcpCliSock.close()
tcpSerSock.close()
其次,客戶端:
from socket import *
HOST = '127.0.0.1' # or 'localhost'
PORT = 21567
BUFSIZ =1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data1 = input('>')
#data = str(data)
if not data1:
break
tcpCliSock.send(data1.encode())
data1 = tcpCliSock.recv(BUFSIZ)
if not data1:
break
print(data1.decode('utf-8'))
tcpCliSock.close()
4、結果展示
服務器端
客戶端
轉載地址:https://blog.csdn.net/su_bao/article/details/80380465