项目任务(三)设计三层程序结构与集成编程_第1页
项目任务(三)设计三层程序结构与集成编程_第2页
项目任务(三)设计三层程序结构与集成编程_第3页
项目任务(三)设计三层程序结构与集成编程_第4页
项目任务(三)设计三层程序结构与集成编程_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.net项目开发基本技能项目:轻院mineqq通信软件开发 轻院软件专业项目文档 作者:廖永红项目任务(三)目录任务描述:1知识技能:1方案分析:1实践内容:2网络通信类的设计2逻辑功能类的设计4主窗体设计6设置容器主窗体6设置主题标签窗体6的分组及各组列表视图7聊天窗体的设计11学习研究:12任务描述:将本地飞鸽通信软件分成三层结构:基本通信层负责数据的发送、接收,中间的功能逻辑层负责实现处理数据处理,上面的界面层负责操作事件的处理。 分别实现各层的代码编写。知识技能:知识:软件结构设计的独立性原则、复习程序间数据传递的基本方法。技能:在教师及文档的指导下,能进行软件层次的初步划分,编程实现

2、,进行集成调试。方案分析: 在设计mineqq软件的主要功能的程序类时,我们将它们分为三个层次:界面层、qq功能逻辑层、网络通信层,在服务器端,还可以把对数据库的访问的程序看作一层。界面层是窗体类、控件类等,界面层的类实例是在界面设计时由.net生成的,即:窗体、拖入窗体的控件。上面用例图中的每一个用例功能都不是太大,可以把实现每一个用例功能的程序封装成一个逻辑功能类,也可把几个功能放到一个类里。分别将客户、服务器端的网络收发程序,封装成各自的网络通信类。在服务器端,将有关数据库的连接、访问程序封装为一个实体访问类。实践内容:网络通信类的设计 mineqq软件中,qq聊天消息、公告消息、询问等

3、消息,每消息的内容较少,对可靠性、消息次序的要求不高,采用相对简单高效的udp数据包传送。在设计时,我们规定包的发送与接收分别用不同的端口号,双方通信示意如下:mineqq软件中,文件、多媒体信息的网络传送,内容多,对可靠性、包次序的要求高,采用面向连接的tcp流传送。当tcp连接后,可以在一个连接上进行收发操作,示意图如下:客户端网络通信类的大致结构(类图)如下:(此阶段只考虑udp) class clientnetcomm static int udprecvport = 50004;/在此端口等待收包 static socket send_socket = null; static so

4、cket recv_socket = null; /向网络发送udp包 public static int sendudpto(string ip,int port, string data_str) return 0; /发送包时默认发到端口udprecvport public static int sendudpto(string ip, string data_str) return 0; /循环等待,接收udp包,并调用逻辑类的方法来处理public static void waitreceiveudp_func() 通信类的程序只负责收发数据,只是对socket程序的封装,便于他处使

5、用。逻辑功能类的设计 定义一个用来保存用户信息的类型,如下: /保存用户信息的变量的结构类型 public class userinfo public string id;/用户id public string name;/用户友好名 public int icon;/用户头像号 public string sex;/用户性别 public int old;/用户年龄 public string desc;/用户描述 public string ip;/用户的ip public system.datetime beat_time;/最近收到心跳的时间 public int msgcount=0

6、;/偿未读取的聊天信息数 public system.windows.forms.form talkform=null;/聊天窗体 public bool isupdated=false; /信息是否已已更新我们把qq的主要功能程序,与上层的界面及下层的网络分开,封装到一个clientqqfunc类中,主要负责两类事务:1.接收到数据包时,调用这些相应方法来处理,并引起更新界面)。2.当界面有操作或定时器时间到,调用这些相应方法来处理,并把数据发送到网络。此外,qq的主要数据,例如:本地在线用户信息、qq在线用户信息、当前用户的信息等,在这个类中设计变量来保存。为了能在任何地方通过类名就可访问

7、到这个重要的变量、方法,我们都采用静态的。类图如下: /功能:处理网络数据、(定时)把数据更新到界面、构造数据包并发到网上、启动关闭过程 /方法:handle_xxxxx、update_xxxxxxxxxxxxxxx、send_xxxxxxxxxxxxxxx、qq_xxxxxxxx class clientqqfunc /保存qq客户端的主要数据的对象变量 public static userinfo localuser_info= null;/当前登录用户 public static hashtable localuser_list = null;/保存本地所在的在线用户信息对象 publi

8、c static datatable talkmsg_history = null; /用表来保存历史聊天消息 public static datatable talkmsg_current = null; /用表来保存当前收到但未显示的聊天消息public static bool show_non_online = false; /是否显示非在线用户 /初始化并启动线程 public static void qq_startup() /结束,停止qq相关线程 public static void qq_shutdown() /界面更新的定时时间到,据数据,进行界面的更新 public sta

9、tic void update_qqmainfrom(qqmainform mainform) /更新某聊天用户的聊天窗体,并在消息控件中显示聊天消息 public static void update_qqtalkfrom(string user_id) /所有打开的聊天窗体,并在消息控件中显示聊天消息 public static void update_qqtalkfrom() /用收到的本地qq广播的心跳包,更新“本地在线”列表 public static void handle_heartbeat1_data(string recv_str, string ip_str) /处理对方q

10、q发来的聊天消息,把消息插入消息表,并在窗体显示消息内容 public static void handle_talk_data(string recv_str, string ip) /心跳线程函数,启动线程后,每隔秒发出一次心跳 public static void send_myheartbeat_func()(把上面的类的框架代码建好,方法内程序暂时不写)主窗体设计设置容器主窗体添加一个新窗体,作为qq主窗体,名称改为qqmainform,调整至qq窗体形状,设置自已喜爱的标题及图标,设“maximizebox”属性为false(不允许窗体最大化)。从工具箱拖入一个“toolbar”

11、控件(.net2005为toolstrip),命名为“qqtoolbar”,根据你的设计需要,加入几个工具按钮。在qqmainform的类代码中加入main函数,使得应用程序能从此窗体启动执行。加入的代码如下:/ 应用程序的主入口点。stathreadstatic void main() application.run(new qqmainform();在visual .net studio 2005中,将启动程序program.cs中的语句:application.run(new form1(); 改为 application.run(new qqmainform(); 关闭主窗体时,退出整

12、个程序,加入代码: private void qqmainform_formclosed(object sender, formclosedeventargs e) environment.exit(0);/完全退出程序 设置主题标签窗体从工具箱从拖入一个tabcontrol控件到主窗体上,并设置填充整个窗体(dock=fill),控件对象改名为qqtabcontrol,设“alignment”属性为left(标签在左边)。找到属性“tabpages”,点击进入标签面板添加界面,加入几个标签面板,并重新给每个标签命名: tabpage_local(本地在线)、tabpage_online(在线

13、qq)、tabpage_myshow(我形我秀)、.。从工具箱从拖入一个imagelist控件,改名为qqimagelist,为qq面板选择多个喜爱图标,添加入qqimagelist控件对象中。关联qqimagelist到tabcontrol(设置tabcontrol控件的“imagelist”属性为qqimagelist),分别点击各标签,为它们设置标签图标(imageindex属性),为各标签标设置tooltiptext提示文本(其它界面属性,同学们根据自已喜好设置,也可以设置drawmode=ownerdrawfixed,然后自已绘制各标签头,生成漂亮的个性风格)。标签“本地在线”是用来

14、显示同在本地局域网中的qq在线用户,标签“在线qq”是用来显示与自已有关的所有qq在线用户组,如:我的朋友、陌生人、黑名单、我的群组等。其它标标签的内容,同学们自已设计。从工具箱从拖入一个timer(计时器),更名为“timer_update_view”,设定定时的时间为20000毫秒,并在窗体的load事件程序中启动它(参看后面)。的分组及各组列表视图 的分组:我的朋友、我的学生、我的群组、陌生人等等。点击选择tabpage_online(在线qq)标签,从工具箱从依次拖入botton控件、listview控件,到tabpage_online(在线qq)标签上,并设置它们项端对齐(dock=

15、top),设置它的显示默认方式(view=largeicon)、项对齐方式(alignment=left)、大小图标列表(largeimagelist=imagelist_user_large、smallimagelist=imagelist_user_small)、背景色、鼠标经过时项提示信息可见(showitemtooltip=true)。为每一个分组,重复一次上面的操作,并为每个控件命名,如图:写各按钮的点击事件代码,在form_load事件中初始化,进行默认设置(执行“我的朋友” 按钮的点击事件处理程序),在关闭主窗体时,退出整个应用程序。qqmainform中部分代码如下: priv

16、ate void button_myfriends_click(object sender, eventargs e) listview_myfriends.dock = dockstyle.fill; listview_myfriends.show(); listview_mystudents.hide(); listview_mygroups.hide(); listview_stranges.hide(); button_myfriends.dock = dockstyle.top; button_mystudents.dock = dockstyle.bottom; button_my

17、groups.dock = dockstyle.bottom; button_stranges.dock = dockstyle.bottom; private void button_mystudents_click(object sender, eventargs e) listview_mystudents.dock = dockstyle.fill; listview_myfriends.hide(); listview_mystudents.show(); listview_mygroups.hide(); listview_stranges.hide(); button_myfri

18、ends.dock = dockstyle.top; button_mystudents.dock = dockstyle.top; button_mygroups.dock = dockstyle.bottom; button_stranges.dock = dockstyle.bottom; private void button_mygroups_click(object sender, eventargs e) listview_mygroups.dock = dockstyle.fill; listview_myfriends.hide(); listview_mystudents.

19、hide(); listview_mygroups.show(); listview_stranges.hide(); button_myfriends.dock = dockstyle.top; button_mystudents.dock = dockstyle.top; button_mygroups.dock = dockstyle.top; button_stranges.dock = dockstyle.bottom; private void button_stranges_click(object sender, eventargs e) listview_stranges.d

20、ock = dockstyle.fill; listview_myfriends.hide(); listview_mystudents.hide(); listview_mygroups.hide(); listview_stranges.show(); button_myfriends.dock = dockstyle.top; button_mystudents.dock = dockstyle.top; button_mygroups.dock = dockstyle.top; button_stranges.dock = dockstyle.top; private void qqm

21、ainform_formclosed(object sender, formclosedeventargs e) environment.exit(0);/完全退出程序 在主窗体启动时,要做好各种初始工作:1. 初始化界面。2. 显示登录窗体,进行认证。3. 启动“定时发送心跳”、“等待接收网络数据”、“定时更新界面”等线程。代码如下: private void qqmainform_load(object sender, eventargs e) this.hide();/主窗体启动时,先隐藏主窗体本身,再弹出登录窗体 qqloginform loginform = new qqloginf

22、orm(); loginform.showdialog();/以对话框方式显示登录窗体 button_myfriends_click(null, null);/默认显示“我的朋友”相当点击“我的朋友” /初始化并启动qq相关线程(请看后面功能类) clientqqfunc.qq_startup(); /启动环循发送心跳线程、等待接收数据包的线程 /定时执行界面更新 timer_update_view.start(); qq主窗体关闭时,要停止qq相关线程,代码如下: private void qqmainform_formclosed(object sender, formclosedeven

23、targs e) clientqqfunc.qq_shutdown();/qq相关线程(请看后面功能类) environment.exit(0);/完全退出程序 当双击(doubleclick )“本地在线”中的用户头像时,把从“在线用户列表”变量中取出此用户数据,看它是否已有聊天窗体?没有则新建一个,并从聊天消息表变量中,取用户聊天消息显示出来。弹出聊天窗体(在后面设计),代码如下: private void listview_localuser_doubleclick(object sender, eventargs e) /双击,弹出聊天窗体 listviewitem click_ite

24、m = listview_localuser.selecteditems0;/被击中的项 string user_id = click_item.text; /弹出聊天用户的聊天窗体,并在历史消息控件中显示历史聊天消息 userinfo user_info = (userinfo)clientqqfunc.localuser_listuser_id; qqtalkform talk_win = (qqtalkform)user_info.talkform; if (talk_win = null)/窗口是否已存在 /窗口不存在,建新聊天窗体,并从消息表中取出聊天信息更新到窗体消息控件上 tal

25、k_win = new qqtalkform(); /把用信息信传递(设置)给它,以后使用 talk_win.other_info = user_info; talk_win.self_id = clientqqfunc.localuser_info.id; talk_win.text = 正在与 + user_info.id + 聊天; user_info.talkform = talk_win; /把新建聊天窗体与用户信息相关联,方便以后找到 talk_win.show();/显示聊天窗体 clientqqfunc.update_qqtalkfrom(user_id); /更新聊天窗体聊天

26、消息(请看后面功能类)双击timer_update_view,写定时从“本地在线用户列表”、“聊天消息表”取数据,更新qq界面的程序,如下: /界面更新的定时时间到,据数据,进行界面的更新 private void timer_update_view_tick(object sender, eventargs e) clientqqfunc.update_qqmainfrom(this);/更新主窗体(请看后面功能类) clientqqfunc.update_qqtalkfrom();/更新已打开的聊天窗体(请看后面功能类) 聊天窗体的设计添加一个新窗体,作为qq聊天窗体,名称改为qqtalkform,在窗体上加入两个richtextbox:richtextbox_talkmsg(显示聊天记录)、richtextbox_input(聊天输入)。并将richtextbox_talk

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论