意大利面条代码是一种很直接的实现方法。但是,毕竟日后维护会引发不便。
不包含加密和文件传输飞鸽程序可以分解成两部分:
1. GUI。呈现图形界面,相应用户输入。实际上就是把读取键盘的线程变成GUI而已,但是已经不包含了任何与网络相关的部分,如socket维护等。这里维护系统状态,如邻居表:就是通讯录,记录每个邻居的IP地址、用户名、主机名、昵称、群组、在线情况(以及可用的加密算法等)。
2. Communicator,通信器。负责维护socket,接收和解析数据报、并根据GUI发来的请求,组装相应的报文,发出相应的报文。本身唯一的状态就是socket本身。
这里GUI作为主对象,创建和控制Communicator。它们之间有如下通信接口:
----------------------------
<< interface >>
ICore // GUI实现这个接口
----------------------------
PROPERTIES:
+ get_context() : {username,host,nick,...}
// 取得当前主机的信息,包括用户名等。
----------------------------
EVENTS:
+ node_notify(ipaddr,username,host,nick,group,away)
// node_notify通知GUI新的节点加入。
+ incomming_message(ipaddr,message_text,sealed)
// 当有新消息到达时,这个方法会调用。
----------------------------
----------------------------
<< interface >>
ICommunicator // Communicator实现这个接口
----------------------------
EVENTS:
+ refresh()
// 命令通信器广播当前主机加入的命令IPMSG_BR_ENTRY。
+ send_message(ipaddr,message_text,sealed)
// 向某个用户发送消息。
+ read_notify(ipaddr,packet_num)
// 告知某邻居,它发出的消息已读。
----------------------------
实现仍然用Python语言实现。
当然,在Python语言里是没有所谓的Interface这样的东西的。(一定想要在Python里用Interface的请找Zope Interface)全靠对象自己自觉。执行的时候对象只管调用方法,不会考虑它是否存在。但是Python里面没有异步的Event这种机制。上述UML里的events也是用同步的方法调用来实现。
程序中一共有两个活跃的线程:一个是GUI线程;另一个是socket接收线程。Python的线程间通信明显不如Erlang语言强大(废话)。如果引入MessageQueue,必然要引入Mutex和Condition的话,对于这样的小程序太overkill了。事实上现在的这个程序就是线程不安全的。
GUI用PyGTK实现,设计如下:
本来是觉得,把所有东西都放在屏幕上,有一种一目了然,很爽的感觉。现在看看似乎也不行,太挤了。
这样的设计,还是有问题的
- GUI,感觉扩充已经是问题了。塞的满满的。
另一个问题是
- 目前线程的结构,是按照输入来区分的线程:一个用户输入,另一个网络输入。输入之后,执行者分属不同的对象,但方法调用却位于各个模块中。换句话说,两个不同线程在同时忙于多个互相交叠的一组对象。这使得两个线程的责任不清(在对象级别降低耦合了,但在线程级别没有),还使锁不可缺少。另外在GTK中使用线程本身就会遇到一些问题。
可行的解决方法:
* 是否可能将socket IO集成到GTK的MainLoop中,使得数据包的到达成为一个事件。这样就可以用单线程事件轮询的方式,以处理GUI事件相同的方法处理IO。
优点是避免多线程的麻烦。缺点也是抛弃了多线程的方便。IO的处理必须以“有限状态自动机”的形式构造(即设计模式里的State模式)。明显,用Python语言实现状态机会遇到困难,也有可能给调试添加麻烦。
下一个问题:
- GUI中,状态(通讯录/邻居列表)如何保存。目前的实现方法是使用GTK的ListStore。虽然不是什么问题,但是这使得程序和UI耦合更加紧密——毕竟ListStore是为GTK的TreeView专门设计的结构。
理想的模块化,是将程序分为至少3部分:通信器/核心/GUI。核心保存状态,执行协议操作,而GUI只是表现这样的状态。耦合度松到一定程度,使得只要在一个XML说用哪个GUI,用哪个核心,用哪个通信其,它们如何如何连接,就可以执行。(依赖注入?)
用MVC的语言说,通讯录就是M,GUI就是V,核心就是C。
* 我相信,软件必须有一定的耦合度。高耦合的代码不易应对变化;而低耦合的代码必须用足够多的“胶水”连接它们,反而麻烦。
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0012/5836/ab464429-20a2-38ba-9fab-770c96522c83-thumb.png)
- 大小: 52.9 KB
分享到:
相关推荐
"飞鸽传书",全称为"Ipmsg (Internet Pager Message)", 是一款广泛应用于局域网内的文件和信息传输工具。这款软件以其简洁的操作界面和高效的数据传输能力,深受用户喜爱,尤其适合在公司、学校等网络环境中快速分享...
用户可以通过飞鸽轻松地发送各种类型和大小的文件,无论是一份重要的报告还是大量的图片资料,飞鸽都能够快速而安全地完成传输工作。 安全是飞鸽在文件传输方面尤为注重的一点。在高速发展的信息技术时代,数据安全...
飞鸽 飞鸽 飞鸽飞鸽 飞鸽 飞鸽
在这个现代化的版本中,“飞鸽QT”利用了Qt的网络编程模块,实现了文件的点对点传输。该系统可能包含以下关键组件: 1. **用户界面**:Qt提供了一个灵活的GUI构建工具,使得开发者能够设计出美观且用户友好的界面,...
一款网络基础软件,用于朋友之间飞鸽传书,是一款很实用的小软件,需要的自己试一试。
飞鸽传输软件,又名“飞鸽飞鸽”,是一款专为局域网设计的高效、便捷的数据传输工具。它在企业、学校等需要快速分享文件的环境中广泛应用,因其简单易用和快速传输的特点深受用户喜爱。飞鸽软件的核心功能是通过...
标题“飞鸽局域网内文件传送最方便”所指的是使用“飞鸽”这款软件在局域网内部实现高效便捷的文件传输。飞鸽是一款专为局域网设计的文件分享和传输工具,它允许用户在同一个网络环境下快速地发送大文件、文件夹,...
feige2016_for_Windows,飞鸽传书,用于局域网通信聊天或文件传送
本文将详细解析飞鸽源码的主要结构、功能模块以及关键技术和算法,帮助你掌握如何构建类似应用。 飞鸽源码的核心部分包括以下几个主要组件: 1. 用户认证模块:这一部分负责用户的身份验证和授权。源码中可能包含...
飞鸽传输Java版是一款基于Java技术开发的文件传输软件,其设计目的是为了提供高效、便捷的文件分享功能,尤其适用于局域网内的快速文件传输。Java作为一种跨平台的编程语言,使得飞鸽传输Java版具备了良好的兼容性,...
《飞鸽传书:经典与现代的通讯技术融合》 飞鸽传书,这个名称源自古代的一种信息传递方式,利用鸽子的归巢本能来传递信件,象征着远距离的快速通信。在信息技术高度发达的今天,"飞鸽传书"已经演变成了一款数字时代...
飞鸽传书(iPMSG)是一款源自日本的局域网即时通讯软件,因其小巧、易用的特点,在2000年代初期广受用户欢迎,尤其是对于需要在局域网内进行快速通信的企业和团队。"飞鸽2007"是这个软件的一个特定版本,可能包含了...
飞鸽传书,又名iPigeon,是一款在2000年代初期非常流行的局域网即时通讯软件。这款软件以其便捷的文件传输、快速的消息传递以及对局域网环境的良好适应性,在那个互联网速度相对较慢的时代,深受用户喜爱。标题提到...
3. **文件传输模块**:包含文件的上传和下载逻辑。在发送文件时,可能会先将文件切分为小块,然后逐个发送;接收端则按顺序接收并拼接文件。 四、实现与调试 在Visual Studio 2005中,开发者可以通过新建项目,...
【企业飞鸽短信版】是一款广泛应用于企业及高校的通讯工具,主要功能在于招生宣传和其他内部或外部的信息传递。这款软件以其高效、便捷的特性,成为众多机构进行短信沟通的首选。 首先,从“企业飞鸽”这个标签,...
飞鸽传书的架构设计遵循模块化原则,主要分为以下几个关键部分: 1. 用户界面:采用Qt库构建,提供直观易用的图形用户界面,支持文本聊天、文件传输等功能。 2. 网络通信模块:使用Socket进行底层通信,实现P2P...
《C++飞鸽源代码解析与编译指南》 在信息技术领域,源代码是软件开发的基础,它揭示了程序的工作原理。"C++飞鸽源代码"是一个专注于C++编程语言实现的即时通讯软件——飞鸽传书的源代码。这份资源提供了深入理解...
飞鸽传书是一款经典的局域网通信软件,尤其在老版本中,因其绿色免安装的特点深受用户喜爱。这款软件回归了通信工具的本质,无需复杂的安装过程,用户可以直接运行程序进行文件传输和信息交流,大大提升了使用的便捷...
飞鸽传书(IPMSG)是一款历史悠久的局域网即时通讯软件,因其高效、便捷的文件传输功能而在用户中广受欢迎。2007版的飞鸽是该软件的一个经典版本,它集成了多种实用特性,旨在提供稳定、快速的通信体验。 1. 文件...