twisted搭的 TCP服务器怎么关闭连接下来的客户

twisted搭的 TCP服务器怎么关闭连接下来的客户,第1张

现在遇到问题:我listen后,客户机若没有连上会定时连接到服务器(长连接),连上后tiwsted会新开线程去服务这个客户,但是我listen的端口不只一个,如果一个客户的需求发生变化,我需要动态的更换factroy而不是关闭整个服务器程序。

所以我想要关闭连接在某个端口上的所有设备(例如端口6969),在次期间更换工厂,然后重新listen此端口,等到客户机再次连接时就可以使用新的协议,而不影响我listen的其他端口

,twisted里面只找到了stopListening他可以停止listening可是,已连的客户并不会断开

(因为客户除特殊原因不会自动断开)

------解决方案--------------------------------------------------------

stopListening返回的是个defer,你在上面增加一个callback就行了

因为tcp socket只是传送一个段连续的数据流,如果你write:

self.transport.write('Z')

self.transport.write('Z')

self.transport.write('Z')

因为三个write是连续的,所以对socket来说,它要传的就是用hex表示的'5a 5a 5a'这样一段数据,你分开写或者一次写对socket来说没有什么区别。

tcp socket的另一端需要接受多次的,要么是你要传送的数据太大,一个packet装不下,要么就是两次传送之间的时间有间隔,会形成两个packet。

一般的处理是你需要另外的一个Application Layer的protocol,比如最简单的你用\r\n来分隔每一个write,然后在接收到的时候可以在数据里找到\r\n,然后就可以分别处理每一个write了。

示例:客户端每隔10秒向服务端报送设备使用情况,具体数据如下:

数据以文本进行传输,传输格式:Key:Value,中间用冒号分隔。服务端只做数据的原样显示并回复"OK!"

由于 UDP 没有连接的概念,所以大多数情况下,采用 UDP Socket 实现的应用都是由设备采集数据上报到服务上来运行的。

虽然对于 UDP 来说没有服务端和客户端的概念,但在实际项目开发中,我们一般还是要区分服务端和客户端的。对于 UDP 服务端来说,其实代码很简单,因为其主要任务就是接收数据,然后对数据进行处理。

先来编写代码框架:

代码中,主要实现的是 datagramReceived 事件,一般在该事件的代码中就是我们的业务逻辑,示例代码如下:

客户端代码相对比服务端要复杂一点,主要是客户端需要执行定时任务,这样的话,我们需要设计一个线程来执行该定时任务,由于线程中需要发送数据到服务端,所以,在线程中需要设计一个属性指向客户端的 Protocol。线程的框架代码如下:

客户端框架代码:

线程主要通过 Protocol 发送数据,实现代码如下:

客户端 Protocol 代码实现如下:

在 Protocol 启动时连接到服务器,这样就可以形成 Connected UDP,相对于 UDP 来说,数据的传输可靠性有所提高,同时,在代码中发送数据也不需要写服务端的地址。

服务端:

客户端:


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/247755.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存