学习笔记-python网络编程-TCP面向连接

四层网络构架模型工作原理

应用层

应用层实际上就是将对应的信息进行打包发送给传输层

传输层

传输层打包应用层的信息后加上自己的协议信息,最重要的是这里加上对应的端口信息

网络层

打包传输层的信息,这一层是ip协议,该层就是打包传输层的内容,加上ip协议后继续打包传递给下一层

物理层

物理层接收上面的打包,然后再继续将mac物理地址封装在包内,使用物理信号再次传输给外面

如此就完成了整个发送,从物理层之后就是传递出本机,之后去寻找如果是内网,那么就直接通信,如果不是内网那就直接去找网关,之后继续找路由

TCP协议

tcp是比较安全的,面向连接的

udp除了快速之外其他的都不能和tcp相比

使用tcp进行连接的需要先导入库

一下就是模拟客户端和服务端进行连接操作代码演示

from socket import *

# 创建对象 第一个是ipv4 第二是TCP
client = socket(AF_INET, SOCK_STREAM)
# 创建需要连接的地址
address = ('172.16.17.16', 8080)
# 创建连接
client.connect(address) # 如果连接不成功则直接报错
# 发送消息
client.send('data'.encode('gb2312'))

由于使用的是其他软件进行模拟的,服务器使用的编码必须和客户端使用的编码是相同的,否则就会出现乱码的现象

这里用的是gb2312编码

因为是面向连接的协议操作,这里在创建完对象之后进行创建连接,与udp不同的是,其中因为是面向连接的,所以连接这个过程是需要响应,如果连接发送后没有响应则会继续发送,经过一段时间后还没有响应则认为是连接不上,所以直接抛出异常

建立服务端

服务端与客户端存在一定的不同,服务端是接收数据,并进行相应的处理,之后再进行返回的操作,这里就模拟一个接收数据后直接打印出来

from socket import *

# 创建连接 ipv4 和 TCP
server = socket(AF_INET, SOCK_STREAM)
# 配置网络地址和端口
address = ('172.16.17.16', 8081) # 用8081端口
# 将服务器挂起
server.bind(address)
# 将服务器设定为监听状态
server.listen(10) # 表示连接服务器申请池子的大小
# 创建分器进行处理对应的连接, 返回的是分器对象和连接进来的客户端ip
new_server, client_link = server.accept()
# 从新的分器上拿出客户端访问的连接
from_client_data = new_server.recv(1024) # 取出对应的数据
print(f'来自{client_link}的数据{from_client_data.decode("gb2312")}')
# 关闭分器
new_server.close()
# 关闭总器
server.close()

服务端实际上应该是一直处于挂起的状态,因为服务端关闭,使用的客户端是连接不上的

使用服务端的监听式发送,实现客户端发送的数据原路返回给客户端

from socket import *

# 创建连接 ipv4 和 TCP
server = socket(AF_INET, SOCK_STREAM)
# 配置网络地址和端口
address = ('172.16.17.16', 8081) # 用8081端口
# 将服务器挂起
server.bind(address)
# 将服务器设定为监听状态
server.listen(10) # 表示连接服务器申请池子的大小

while True:
    # 从新的分器上拿出客户端访问的连接
    # 创建分器进行处理对应的连接, 返回的是分器对象和连接进来的客户端ip
    new_server, client_link = server.accept()
    while True:
        from_client_data = new_server.recv(1024) # 取出对应的数据
        if from_client_data:
            print(f'来自{client_link}的数据{from_client_data.decode("gb2312")}')
        else:
            print("断开连接")
            new_server.close()
            break

因为这是一个死循环,外面的循环是永远不会停止的,所以这里是一直处于监听状态,实际上我们的服务器也是如此,服务器是不会停机的,一直都开放着端口

我们软件能操作的都是应用层部分,下面的tcp和udp对应的传输层是我们无法操作的,别人都封装好了库

socket库里面把下面的传输层协议和网络层协议都封装好了,拿过来直接用就可以了,真正要自己去写这些协议,目测需要撸个好几年,我们先实现功能,后面再深挖里面的底层

猜你喜欢

转载自blog.csdn.net/weixin_43959953/article/details/84962876