所以我想要关闭连接在某个端口上的所有设备(例如端口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 来说,数据的传输可靠性有所提高,同时,在代码中发送数据也不需要写服务端的地址。
服务端:
客户端:
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)