简单TCP服务器构建(python)

一.基本概念

  • Socket(套接字)

socket是一种操作系统提供的进程间通信机制。[1] 在操作系统中,通常会为应用程序提供一组应用程序接口(API),称为套接字接口(英语:socket API)。应用程序可以通过套接字接口,来使用网络套接字,以进行数据交换。最早的套接字接口来自于4.2 BSD,因此现代常见的套接字接口大多源自Berkeley套接字(Berkeley sockets)标准。在套接字接口中,以IP地址及通信端口组成套接字地址(socket address)。远程的套接字地址,以及本地的套接字地址完成连线后,再加上使用的协议(protocol),这个五元组(five-element tuple),作为套接字对(socket pairs),之后就可以彼此交换数据。例如,在同一台计算机上,TCP协议与UDP协议可以同时使用相同的port而互不干扰。
操作系统根据套接字地址,可以决定应该将数据送达特定的行程或线程。这就像是电话系统中,以电话号码加上分机号码,来决定通话对象一般。
材料来源:维基百科

套接字顾名思义就是像插座一样起到了套接的作用。我们知道当不同的两台计算机进行通信时,需要通过彼此的ip地址进行寻址通信,但是计算机上面运行的软件很多,比如在你开微信的时候还听着歌,那么不同的应用程序进行通信时是如何做到互不影响的呢?这就是端口的用途,或许你觉得你可能用不到这个玩意,当你在网上输入任意一个网址时,浏览器都默认给网址的最后加上80(http协议通信默认端口),程序便可以通过端口进行通信,传递信息。

  • TCP协议
    TCP为传输控制协议,我们所遇到的大部分通信都是基于TCP协议的可靠通信,TCP连接之所以可靠是因为TCP建立的是长连接,创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。

二.实现原理

1. 创建socket

在这里我们直接导入socket模块,然后创建socket对象,socket类初始化时需要赋参数,因为我们这里创建的是TCP服务,所以就不应改动,如果创建Udp服务时则应该改为family=AF_INET,type=SOCK_DGRAM
socket类构建方法参数类型
在这里插入图片描述
2.客户端请求连接
在这里为了简化,我直接使用socket测试工具进行连接,并发送数据‘hello’
accept()方法可以返回一个元组,为一个新的套接字与客户端ip地址与端口,之所以需要返回一个新的套接字是因为为了满足下一次的通信需要,如果使用一个套接字时那么当发送来别的请求时将无法继续监听,因为此时的socket正在使用,所以需要新建一个通信管道。
在这里插入图片描述

三.方法改进

上面我们是从最底层建立TCP连接(即从建立最基本的socket开始),事实上在真正的开发中程序员很少去从最底层做,因为已经有了封装的比较好的类库,从而避免了重复造轮子,在这里我们将使用socketserver模块中的服务基类与请求处理基类实现该功能
在这里插入图片描述
这样我们便不用去关心底层建立socket的细节,而只关心业务逻辑的处理,使用TCPServer类有一个缺陷,就是只能为一个客户端服务,是单线程的,当我们想要创建多线程连接时可以使用ThreadingTCPServer类来满足。
另外,当我们想要去调整底部的socket时可以设置参数bind_and_activate=False
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值