python中基于tcp协议的通信(数据传输)

Posted suguangti

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中基于tcp协议的通信(数据传输)相关的知识,希望对你有一定的参考价值。

tcp协议:流式协议(以数据流的形式通信传输)、安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信)

tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层、数据链路层、物理层。可以说很多安全数据的传输通信都是基于tcp协议进行的。

为了让tcp通信更加方便需要引入一个socket模块(将网络层、数据链路层、物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作。

简单的tcp协议通信模板:(需要一个服务端和一个客户端)

服务端:

from socket import *
# 确定服务端传输协议↓↓↓↓↓↓↓
server = socket(AF_INET, SOCK_STREAM) # 这里的SOCK_STREAM代表的就是流式协议TCP,如果是SOCK_DGRAM就代表UDP协议
# 固定服务端IP和PORT,让客户端能够通过IP和端口访问服务端↓↓↓↓↓↓↓
server.bind((127.0.0.1, 8080))    # (‘127.0.0.1‘, 8080)这里必须用元组形式传入IP和PORT,本地访问本地IP默认为‘127.0.0.1‘
# 设置半连接池数量(一般为5)
server.listen(5)  # 半连接池:客户端连接请求个数的容器,当前已连接的客户端信息收发未完成前,会有最大5个客户端连接请求进入排队状态,
                  # 等待上一个通信完毕后,就可以连接进入开始通信。                                                                                      

# 双向通道建立成功,可以进行下一步数据的通信了↓↓↓↓↓↓↓
conn, client_addr = server.accept()
# 进行一次信息的收与发
data = conn.recv(1024)    # 每次最大接收1024字节,收到的数据为二进制Bytes类型

conn.send(data.upper())   # 将收到的数据进行处理,返回新的数据,反馈给客户端(给客户端发数据),发的数据类型也必须是Bytes类型

# 一轮信息收发完毕,关闭已经建立的双向通道
conn.close()


客户端:
from socket import *
# 确定客户端传输协议↓↓↓↓↓↓↓(服务端和客户端服务协议一样才能进行有效的通信)
client = socket(AF_INET, SOCK_STREAM)  # 这里的SOCK_STREAM代表的就是流式协议TCP,如果是SOCK_DGRAM就代表UDP协议
# 开始连接服务端IP和PORT,建立双向链接
client.connect((127.0.0.1, 8080))  # 通过服务端IP和PORT进行连接

# 走到这一步就已经建立连接完毕,接下来开始数据通信:
client.send(hello,server.encode(utf-8))    # 将发送的信息转码成Bytes类型数据

data = client.recv(1024)  # 每次最大收数据大小为1024字节(1kb)

print(data.decode(utf-8))  # 将b类型数据转换成字符串格式

# 一次传输完毕2
client.close()    # 关闭客户端连接


启动服务端(服务端开始监听客户端的连接请求)
启动客户端(客户端给服务端发送连接请求)
建立双向链接完成
客户端给服务端发送信息 hello,server
服务端收到hello,server,将其转换成大写,返回给客户端(此时服务端一轮通信完毕)
客户端收到服务端的反馈信息,打印出HELLO,SERVER(此时客户端一轮通信完毕)

以上是最基本的一次基于tcp协议通信的过程客户端发,服务端收,服务端处理数据然后发,客户端收到服务端发了的反馈数据。

但是由于tcp协议是一种流式协议,流式协议就会有一个特点:数据的传输像一涓涓水流的形式传输,我们在收数据的时候默认最大收数据大小为1024字节,当发送的数据小于1024字节时候当然不会有问题,一次性全部收完,但是但是但是当发送的数据大于1024字节的时候,我们这边又不知道发送的数据大小是多少,只能默认的1024字节的时候,数据一次性就不可能收完,只能在这次收1024字节,那1024字节以外的数据呢?由于数据的传输是流式协议,所以没有收完的数据会依次排队在门外等着,等待你下次收数据时候再次收取,这样如果每次传的数据大小不确认,收的时候数据也不知道该收多少的时候,就会产生数据的粘粘(zhan nian),这样导致数据的接收不彻底。这就叫tcp的流式协议的通信粘包问题。

这个问题的更形象过程可以见下图:

 

以上是关于python中基于tcp协议的通信(数据传输)的主要内容,如果未能解决你的问题,请参考以下文章

Learning-Python28:基于TCP协议通信的套接字

Python网络编程02/基于TCP协议的socket简单的通信

Python中的端口协议之基于UDP协议的通信传输

Python 基于TCP协议通信的简单套接字编程

Python 基于TCP协议通信的简单套接字编程

python中的tcp示例详解