套接字:進行網絡通信的一種手段,socket
流式套接字(SOCK_STREAM):傳輸層基於tcp協議進行通信
數據報套接字(SOCK_DGRAM):傳輸層基於udp協議進行通信
原始套接字:訪問底層協議的套接字
流式套接字:
TCP服務端
from socket import *
1、創建套接字
socket(scoket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
功能:創建套接字
參數:socket_family:選擇地址族種類AF_INT(UNIX)
socket_type:套接字類型SOCK_STREAM(流式),SOCK_DGRAM數據報
proto:子協議類型默認爲0
返回值:返回創建的套接字
2、綁定IP和端口號
sockfd.bind()
功能:綁定IP和端口
參數:是一個元組,第一項是字符串形式的IP,第二項是端口號
('192.168.1.2',8888)
3、讓套接字具有監聽功能
sockfd.listen(n)
功能:使套接字變爲監聽套接字,同時創建監聽隊列
參數:n監聽隊列大小
4、等待客戶端連接
socket.accept()
功能:阻塞等待客戶端連接
返回值:第一個:返回一個新的套接字用來和客戶端通信
第二個:返回連接的客戶端的地址
5、消息的收發
recv(buffer)
功能:接受消息
參數:一次接受消息的大小 字節
返回值:接受到的內容
send()
功能:發送消息
參數:發送的內容(byte)
返回值:發送了多少個字節
6、關閉套接字
close()
功能:關閉套接字
tcp客戶端流程
1、創建流式套接字
2、發起連接請求
connect()
功能:發起連接
參數:一個元組 第一個元素:服務器的IP,第二個元素:服務器的port
3、收發消息
4、關閉套接字
關於recv和send
發送接受緩衝區:發送和接收消息均放到緩衝區再進行處理
recv接收消息當一次接受不完的時候會下次繼續接收
當recv阻塞時,如果客戶端斷開,則recv立即返回一個空字符串
tcp粘包處理
tcp中數據以數據流的方式發送接收,每次發送的數據間沒有邊界,在接收時可能造成數據的粘連即使爲粘包
粘包如何處理:
1、每次發送消息結束位置加標誌
2、發送的消息添加結構描述
3、當連續發送時每次發送有一個短暫延遲sleep(0.1)