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()