|
.NET软件开发文档
|
|
软件名称
|
Easay
|
|
软件简介
|
Easay是一款插件式多功能局域网双机交流软件。局域网上两台运行本软件的计算机分别作为服务器和客户端进行联接,可实现即时聊天;打开插件后可实现更多实用功能。目前版本提供“网络五子棋”和“电子白板”插件,可实现网上对弈(单机运行人机对战亦可)和网上图形交流。
|
|
作者信息
|
林健 北京理工大学01110407班
Website:http://www.linjian.cn/ E-mail:yumenlj@126.com QQ:71424
|
|
版本信息
|
Version 1.03 2005/02/11 于甘肃兰州
|
开发说明
这个软件是我学习局域网编程时做的,最初做的时候仅是一个试验性质的聊天程序(Easay就是Easy-say的意思)。做好后觉得没什么意思,恰好几天前阅读了金旭亮老师在《开发高手》2004年第6期上发表的文章——“基于组件的.NET软件开发”,于是产生了编写以局域网聊天程序为平台的插件式多功能交流软件的想法。
网络五子棋的游戏实现原理简单,很多人在学习网络编程时都练习这个项目。金老师的选修课的学生作业中就有不少人做网络五子棋。我一方面从网上得到了一些关于五子棋算法的资料,另一方面参考了他人的一些网络五子棋程序,取长补短,完善了我的网络五子棋插件。
而电子白板插件是我把原先做的一个试验性质的矢量绘图小程序直接移植上去的,功能与NetMeeting上那种专业的电子白板相比差距挺大的。
程序主要用C#写成。插件是一个个独立的DLL文件,可以用其他语言编写(电子白板就是用VB.net写的),只要继承EasayPlugin.FrmProgram类并实现指定的方法即可。程序中的EasayTestPlugin是一个最简单的插件实现的例子。有兴趣的朋友可以参照现有的插件开发自己的插件。
其他用到的技术会在后面详细说明。
使用方法
首先需要在两台可以通过IP直接访问的计算机上分别运行本软件,一台作为服务器,一台作为客户端。对于服务器,在Local IP下拉列表中选择与客户端在同一网络上的那个IP,点击“Create Server”按钮。客户端在Server IP文本框中填写服务器的IP,点击“Link to Server”按钮。如果一切顺利,两端的Action区域都会显示连接成功的提示。如果提示“Fail to link to the server.”,则可能是网络配置有问题或开启了防火墙,这时需要检查并调整网络或防火墙配置。如果只有一台计算机,也可以本地测试本软件的两个实例互联,IP为127.0.0.1。

连接成功后,可以在Communion区域发送聊天信息,用法和一般的聊天室相当。停止使用时,双方都点击“Disconnect”按钮即可。
点击“Open Plug-in”按钮可以打开并加载软件的插件。目前版本提供“网络五子棋”(EasayFive.dll)和“电子白板”(EasayPad.dll)插件。双方加载同一插件,即可实现网上对弈或网上图形交流。
五子棋的使用比较简单。右边下面三个按钮可以向对方发出开始或结束游戏的请求,游戏中聊天功能亦可使用。右边上方的“Play with computer”按下后,再提出游戏请求,将和电脑进行人机对战(该功能在非连接状态仍可使用)。


电子白板的使用与一般画图软件相似,只是双方共用一块画板,可以相互看到对方所画内容。
“Close Plug-in”按钮关闭当前插件;“Refresh Local IP” 按钮刷新本机IP列表。
结构设计
这个软件主要由以下几个工程和类构成:
|
主程序
|
|
Easay
|
主程序
|
FrmMain
|
主窗体
|
|
PluginWorks
|
动态加载插件的类
|
|
EasayPlugin
|
插件的基类工程
|
FrmProgram
|
插件的基类窗体
|
|
插件
|
|
EasayTestPlugin
|
示例插件
|
FrmProgram
|
插件窗体
|
|
EasayFive
|
网络五子棋插件
|
FrmProgram
|
插件窗体
|
|
ComputerPlayer
|
电脑玩家控制类
|
|
EasayPad
|
电子白板插件
|
FrmProgram
|
插件窗体
|
其中各种插件均继承自EasayPlugin.FrmProgram类。
技术说明
这个软件在结构和功能上有一些需要说明的地方:
●有关局域网连接和聊天:采用基本的套接字连接,用一个线程持续监听,这种经典的方法不必多说,任何讲网络编程的资料都会介绍这种基础方法,.NET中用现成的类就可以实现。程序通过网络传输文本串,以“MESS”开头表示聊天消息,“PROG” 开头表示程序指令。我对IP的处理比较细致,获知本机IP列出了本机所有IP(因为一台计算机可以同属多个网络:本地局域网、Internet、虚拟局域网、虚拟机的局域网……),同时加入了127.0.0.1这个连接本机的IP。对IP的正确性也用正则表达式去判断了。
●有关动态加载插件:推荐大家先去阅读金旭亮老师的“基于组件的.NET软件开发”一文(《开发高手》2004年第6期),里面有详细原理说明。即使你不清楚这些原理也不用怕,微软的工程师早已将这些技术封装在System.Reflection.Assembly类中,照我的程序的PluginWorks中的样子直接调用即可。实现的基本步骤是:先装入指定的组件代码库,再装入组件代码库中的类,随即创建一个该类的对象实例。
●有关插件的实现:各种插件均继承自EasayPlugin.FrmProgram类。EasayPlugin.FrmProgram类提供了GetInfo虚方法,在插件中重写该方法以得到网上连接的另一方发来的命令,完成指定任务。该类又提供了可直接调用的SetInfo方法,采用.NET事件委托机制,调用FrmMain的SendCommand函数向网上连接的另一方发送命令。
●有关网络五子棋的简单说明:五子棋的开发资料网上多的是,经典的人工智能算法是按双方在棋盘各点处获胜或出现“活三”的可能性种数的计分,选择高分点落子,攻防兼备。在数据传输方面,用不同的字母加数字表示不同的操作和操作者的角色(详见程序注释),用一串0、1、2表示15*15的棋盘上落子的情况(每次都传输整个棋盘似乎不太好,但这样看上去保险一些)。
●有关电子白板的简单说明:用GDI+实现矢量绘图比较简单,但用于网络程序就会出现新的问题:如果一方正在拖动鼠标绘图,另一方同时绘好了一个图形,发送绘图指令给前者,前者程序的Graphics对象就又会被收到的指令引发的函数调用。这样一来就会出异常。我的解决方案是建立一个ArrayList类型的缓冲区,记录在本机Graphics对象工作时累积收到的绘图指令,待本机Graphics对象完成本机用户的任务后读取执行。
开发感悟
正如“基于组件的.NET软件开发”一文中所说,“.NET下开发基于组件的应用软件之简便性与灵活性,为我们开发“拥抱变化”的软件系统提供了新的可能性。原来适用于源代码级别的一些面向对象特性,比如继承和多态,现在都可以推广应用到组件级别。”.NET大大提高了开发效率。做这个小软件来了解组件模式的程序架构设计,确实开拓了我的思路。不要小瞧了.NET,将它看作是简单的“拖控件,搭积木”。真正深入地学习与应用一门技术,才能发现它的精华所在,充分利用它提高我们的工作效率和理论水平。