TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”"
sockfd=socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
本地地址 : ‘localhost’ , ‘127.0.0.1’
网络地址 : ‘172.40.91.185’
自动获取地址: ‘0.0.0.0’
sockfd.bind(addr)
- 功能: 绑定本机网络地址
- 参数: 二元元组 (ip,port) ('0.0.0.0',8888)
-
sockfd.listen(n)
connfd,addr = sockfd.accept()
data = connfd.recv(buffersize)
- 功能 : 接受客户端消息
- 参数 :每次最多接收消息的大小
- 返回值: 接收到的内容
-
n = connfd.send(data)
- 功能 : 发送消息
- 参数 :要发送的内容 bytes格式
- 返回值: 发送的字节数
-
sockfd.close()
- - 功能:关闭套接字
-
sockfd.connect(server_addr)
- tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
- tcp连接中如果一端已经不存在,仍然试图通过send发送则会产生BrokenPipeError
- 一个监听套接字可以同时连接多个客户端,也能够重复被连接
-
- 网络缓冲区有效的协调了消息的收发速度
- send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
-
代码示例:
day2/stick_send.py,stick_recv.py
- from socket import *
-
- # 创建TCP套接字
- tcp_socket = socket(AF_INET,SOCK_STREAM) # 不写参数默认也是tcp
-
- # 绑定地址
- server_addr = ("0.0.0.0",8888)
- tcp_socket.bind(server_addr)
-
- # 设置套接字为监听套接字 (设置后表示tcp_socket可以被客户端链接)
- tcp_socket.listen(5)
-
- # 处理客户端链接
- while True:
- print("等待客户端链接....")
- connfd,addr = tcp_socket.accept()
- print("客户端",addr,'链接')
-
- # 收发消息
- while True:
- data = connfd.recv(1024)
- if not data:
- break
- print("接收到:",data.decode())
- connfd.close() # 对应客户端已经退出
-
- # 关闭
- tcp_socket.close()
-
- from socket import *
- from time import sleep
-
- # 服务器地址
- server_addr = ('192.168.124.133',8888)
-
- # 创建套接字
- tcp_socket = socket() # 默认值就是tcp
-
- # 发起链接
- tcp_socket.connect(server_addr)
-
- # 循环发送消息
- for i in range(5):
- # tcp_socket.send(b"12#") # 加分割符号
-
- sleep(0.1) # 认为添加发送延迟
- tcp_socket.send(b"12")
-
- # 断开链接
- tcp_socket.close()
-
- 1 from socket import *
- 2 import time
- 3 # 读取文件--> send发送
- 4 s = socket()
- 5 s.connect(('127.0.0.1',8888))
- 6
- 7 f = open('img.jpg','rb')
- 8
- 9 # 读取内容,将其发送
- 10 while True:
- 11 data = f.read(1024)
- 12 if not data:
- 13 time.sleep(0.1)
- 14 s.send(b'##')
- 15 break
- 16 s.send(data)
- 17
- 18 time.sleep(0.1)
- 19 s.send("发送完毕".encode())
- 20
- 21 f.close()
- 22 s.close()
- 23 ---------------------------------------------
- 24 from socket import *
- 25
- 26 s = socket()
- 27 s.bind(('0.0.0.0',8888))
- 28 s.listen(3)
- 29
- 30 c,addr = s.accept()
- 31 print("Connect from",addr)
- 32
- 33 # 以二进制写入
- 34 f = open('mm.jpg','wb')
- 35
- 36 #循环接收内容,写入文件
- 37 while True:
- 38 # recv接收--> write写入
- 39 data = c.recv(1024)
- 40 if data == b'##':
- 41 break
- 42 f.write(data)
- 43
- 44 data = c.recv(1024)
- 45 print(data.decode())
- 46
- 47 f.close()
- 48 c.close()
- 49 s.close()
-
socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
sockfd = socket(AF_INET,SOCK_DGRAM)
sockfd.bind(addr)
data,addr = sockfd.recvfrom(buffersize)
- 功能: 接收UDP消息
- 参数: 每次最多接收多少字节
- 返回值: data 接收到的内容
- addr 消息发送方地址
-
n = sockfd.sendto(data,addr)
- 功能: 发送UDP消息
- 参数: data 发送的内容 bytes格式
- addr 目标地址
- 返回值:发送的字节数
-
sockfd.close()