tcp套接字socket編程

套接字:進行網絡通信的一種手段,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)