python读数据库的通信协议是什么_Python中TCP协议的理解

本文深入探讨Python中的TCP通信,包括TCP客户端和服务器的实现,详细解释TCP的三次握手、四次挥手、状态转换以及长连接与短连接的区别。此外,还展示了TCP并发服务器的多进程、多线程和非阻塞实现,并介绍了select和epoll在多路复用中的应用。
摘要由CSDN通过智能技术生成

Num01-->TCP通信模型

这里写图片描述

Test01-->TCP客户端案例

#! /usr/bin/env python3

# -*- coding:utf-8 -*-

from socket import *

def main():

# 1.创建socket

client_socket = socket(AF_INET, SOCK_STREAM)

# 2.指定服务器的地址和端口号

server_addr = ('192.168.105.125',8080)

client_socket.connect(server_addr)

print('connect %s success' % str(server_addr))

while True:

# 3.给用户提示,让用户输入要检索的资料

send_data = input('>>')

# 退出

if send_data == 'quit':

break

# 向服务器请求数据

client_socket.send(send_data.encode())

client_socket.close()

if __name__ == "__main__":

main()

Test02-->TCP服务器端案例

TCP服务器端创建流程如下:

1,socket创建一个套接字

2,bind绑定ip和port

3,listen使套接字变为可以被动链接

4,accept等待客户端的链接

5,recv/send接收/发送数据

#! /usr/bin/env python3

# -*- coding:utf-8 -*-

from socket import *

import time

def main():

# 1.创建socket,stream流式套接字,对应tcp

listen_socket = socket(AF_INET, SOCK_STREAM)

# 设置允许复用地址,当建立连接之后服务器先关闭,设置地址复用

# 设置socket层属性 复用地址 允许

listen_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)

# 2.绑定端口号

my_addr = ('192.168.105.125', 8080)

#shift + insert

listen_socket.bind(my_addr)

# 3.接听状态

#listen中的black表示已经建立链接和半链接的总数

#如果当前已建立链接数和半链接数以达到设定值,那么新客户端就不会connect成功,而是等待服务器。直到有链接退出。

listen_socket.listen(4)

print('listening...')

# 4.等待客户端来请求服务器

while True:

# 接受连接请求,创建新的连接套接字,用于客户端连通信

connect_socket, client_addr = listen_socket.accept()

# accept默认会引起阻塞

# 新创建连接用的socket, 客户端的地址

# print(connect_socket)

# print(client_addr)

while True:

# tcp recv() 只会返回接收到的数据

# 1024表示接受的数据长度

recv_data = connect_socket.recv(1024)

if len(recv_data) == 0:

#发送方关闭tcp的连接,recv()不会阻塞,而是直接返回''

print('client %s close' % str(client_addr))

time.sleep(5)

break

print('recv: %s' % recv_data.decode('gbk'))

# 用完之后,关闭新创建的那个connect_socket

connect_socket.close()

if __name__ == "__main__":

main()

Num02-->TCP协议三次握手

这里写图片描述

Num03-->TCP协议四次挥手

这里写图片描述

Num04-->TCP协议十种状态

这里写图片描述

当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送

发送FIN通常是应用层对socket进行关闭的结果

Num05-->TCP协议的2MSL问题

这里写图片描述

加以说明:

1,2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态。

2,当TCP的一端发起主动关闭,在发出最后一个ACK包后,

3,即第3次握 手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT状态,

4,必须在此状态上停留两倍的MSL时间,

5,等待2MSL时间主要目的是怕最后一个 ACK包对方没收到,

6,那么对方在超时后将重发第三次握手的FIN包,

7,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。

8,在TIME_WAIT状态 时两端的端口不能使用,要等到2MSL时间结束才可继续使用。

9,当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。

10,不过在实际应用中可以通过设置 SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。

Num06-->TCP协议长链接和短链接

TCP在真正的读写操作之前,se

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值