TCP简介

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

TCP为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据(假设丢失了)将会被重传。

Python实现简易TCP程序

TCP server
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-

# 该代码由本人学习时编写,仅供自娱自乐!

# 欢迎留言讨论,共同学习进步!
import json
import time
from socket import *
def Server_JSON(ip, port):
# 创建TCP Socket, AF_INET为IPv4,SOCK_STREAM为TCP
sockobj = socket(AF_INET, SOCK_STREAM)
# 绑定套接字到地址,地址为(host,port)的元组
sockobj.bind((ip, port))
# 在拒绝连接前,操作系统可以挂起的最大连接数量,一般配置为5
sockobj.listen(5)
print('服务器准备就绪!')
try:
while True: # 一直接受请求,直到ctl+c终止程序
# 接受TCP连接,并且返回(conn,address)的元组,conn为新的套接字对象,可以用来接收和发送数据,address是连接客户端的地址
connection, address = sockobj.accept()
# 打印连接客户端的IP地址
print('Server Connected by', address)
recieved_message = b'' # 预先定义接收信息变量
recieved_message_fragment = connection.recv(1024) # 读取接收到的信息,写入到接收到信息分片
while recieved_message_fragment:
recieved_message = recieved_message + recieved_message_fragment # 把所有接收到信息分片重组装
recieved_message_fragment = connection.recv(1024)
obj = json.loads(recieved_message.decode()) # 把接收到信息json.loads回正常的obj
print(obj) # 打印obj,当然也可以选择写入文件或者数据库
connection.close()
except KeyboardInterrupt:
time.sleep(1)
print('接收到信号,退出程序!')
if __name__ == '__main__':
# 使用Linux解释器 & WIN解释器
Server_IP = '0.0.0.0'
Server_Port = 6666
Server_JSON(Server_IP, Server_Port)
TCP client
#!/usr/bin/env python3
# -*- encoding = utf-8 -*-

# 该代码由本人学习时编写,仅供自娱自乐!

# 欢迎留言讨论,共同学习进步!

import json
from socket import *
def Client_JSON(ip, port, obj):
# 创建TCP Socket并连接
sockobj = socket(AF_INET, SOCK_STREAM)
sockobj.connect((ip, port))
# 把obj转换为JSON字节字符串
send_message = json.dumps(obj).encode()
# 读取1024字节长度数据, 准备发送数据分片
send_message_fragment = send_message[:1024]
# 剩余部分数据
send_message = send_message[1024:]
while send_message_fragment:
sockobj.send(send_message_fragment) # 发送数据分片(如果分片的话)
send_message_fragment = send_message[:1024] # 读取1024字节长度数据
send_message = send_message[1024:] # 剩余部分数据
sockobj.close()
if __name__ == '__main__':
# 使用Linux解释器 & WIN解释器
dict1 = {'key1': 'welcome', 'key2': [1, 2, 3, 4, 5], 'key3': ([3, 4], 'python'),'key4': 'python'*2048}
dict2 = {'key1': 'welcome', 'key2': [1, 2, 3, 4, 5], 'key3': ([3, 4], 'python'), 'key4': 'python'}
Client_JSON('192.168.98.29', 6666, dict1)
Client_JSON('192.168.98.29', 6666, dict2)