网络即时通信系统
2021-02-04
来源:榕意旅游网
…… N删0RK&C0■MUNIC盯ION…………………………………………………………………………………* QQ、MSN等优秀即时通信软件的出现使得人与人之间沟 通的方式和效率都发生了深刻的变化。如果说把电子邮件的出 现比作传真,那么即时通信软件则更像是~部电话,通信双方 甚至多方可以实现即时、互动、双向甚至多向沟通,这种沟通 一 更彻底、更高效、更透明。本文实现了以先进的点对点通信技 术为基础的即时通信系统,更重要的是还采用了数据库技术, 实现了和组织机构、人员等信息的融合。利用这种方法不仅有 效地保障了通信的质量,实现了对离线用户的信息传送和在线 后未读信息的获取,而且很容易和各企事业单位的其他应用系 统实现无缝结合,因而具有重要的现实意义。 本文研究中所使用的工具SQLServer2000数据库和C++ Builder5编程工具,在介绍实现思想的同时展现了核心代码。 “有想不到的没有做不到的”,有了这种思想,用其他任何平 台也都同样能够实现。 一、数据库表格 ’数据库基本表格的创建是系统框架的基础,系统必须的表 格有部门信息表、员工信息表和消息信息表,(如表1、表2、 表3所示示)。 表1组织机构表 表2员工信息表 篷 Employee_工d int 4 盗 釜 usempelol"iyed e vavarcrchaharr 2100 password varchar 20 透 deptno int 4 遴 ozIline varchar 1 筮 ●l P varchar 15 、一, 表3消息信息表 撼 霪嚣 溺鞫霞 离 Ms ̄9"o int 4 釜 Sender varchar 10 篷 Send9ate aateLime 8 、一, 瓣 content varchar 200 、一, Reeeive1. w ̄ll"char 10 IsReceiwed char l 、一, ReceiwedDate datetime 8 、一, 二、网络控件 NMUDP控件是利用UDP(UserDatagramProtocol,用户数 据报协议)发送和接收网络上消息和数据流的控件。UDP协议 位于TCP/IP协议的传输层,依靠IP层进行通信和提供路由功 能与TCP不同的是,UDP协议是面向非连接的协议,但传输 效率要明显优于TCP,在局域网应用中效果更好。 NMUDP控件主要有RemoteHost(远程主机)、RemotePort (远程端E1)和LocalPort(本地端口)等属性。在编程中,Re— moteHost可以设置为远端计算机的IP地址或域名,RemotePort 和LocalPort属性应避免使用保留端口号(如n’P、Telnet等端 口),最好使用1000以上的端口号,本例中NMUDP设置为 3000端口。在属性设置好后,调用SendBuffer和ReadBuffer方 法完成数据发送和接收,两方法的定义如下: Procedure SendBuffer(char Buff,int Length): Procedure ReadBuffer(char{Buff,int Length): SendBuffer用于把缓冲区中的数据发送出去,ReadBuffer用 于接收数据,接收到的数据放在由Buff指定的缓冲区中,参数 Length指定缓冲区的长度。除支持数据的传送外,此控件还支 持数据流的传送。 当用户发送来数据报时,UMDUP控件的OnDataReceived 事件被激发,在编写代码时可以在此事件中加入ReadBuffer方 法将数据读出,然后将其显示在Memo等控件中。 三、功能 1.登录窗口设计与实现 在登录功能除了具备用户名和密码验证功能外,还要增加 一个Powersoek控件,在代码中通过Powersock的LocallP属性 获取登录主机IP地址,最终还要更新员工信息表中对应登录 用户的lP地址项的数据,并将用户在线标志项Online置为 “Y” 图1登录界面 一 … …… …i 、一 … … t … … … { 实用第一 智慧密集 . 一 . , , . 2.主窗口设计与实现 主窗口为用户成功登录系统后显示的主界面如图2所示, //PThisNodelnfo为在main。h中定义的结构类型变量, //有aslP、asOnlineasEmployeelD等属性. forfintj={:j< kemp_count;j十+) {if(T employee一>FieldByName( deptno )一>Aslnte— ger==ideptno)- {s_employee=T_employee一>FieldByName( 一包括树形控件(TreeView1)、开始交流按钮、查收未读信息按 钮以及T_dept、T_employee、T』nsg、Query1等数据库表连接控 件。开始交流按钮主要完成对所选聊天对象的主机IP地址的 提取,用此IP地址初始化聊天窗口NMDUPI控件远程主机 employee ) >AsString; PThisNodelnfo一>aslP=Temployee一>FieldByName f _IP,并打开聊天窗口;查收未读信息按钮完成对未读信息窗口 的调用。主窗1:3的主要功能是实现树形组织机构、用户等信息 IP")一>AsString: PThisNodelnfo一>asOnline=Temployee一>FieldBy- 的显示,以及实现对目标用户主机IP地址等信息的提取,以 _Name( online }一》AsString: 便初始化NMUDP控件远程主机IP地址信息,代码如下。 PThisNodelnfo一>asEmployee!D=T employee一》FieldBy— Name《 Employee Id )一>Aslnteger; 鞠酗血砌r雕黔。曼●l 囡醢 New emp谨选择沟通潮爨 _node;TreeViewt一>ttems一>AddChitdObject £==]=中国石油天然气管道局 《New_dept node,s employee,PThisNodel nfo): 鼍 .==j办公室 if 《 mployee一>FieldByName( online )一>As— 0张三 L二]财务部 String== Y l 旦李四 {New_emp_node一>Imagelndex=2:} ]凡力资源部 _=]_市场部 //在线用户用第二个图标 ]工程部 else{New__emp node一>Imagetndex=3:} 一 技术服务与燃气部 嚣蓦墨冒 //不在线用户用第一个图标 j企业管理部 New emp_node一>Selectedlndex=1:) L二安全环保部 ]工会 T mployee一>Next():l J纪蚕(监察部) 丁 ept一>Next(J=} Root_Node一>Expand(true): 开始交流i查收表读信息{ 3.聊天窗口 接有3经雕 t 此窗口主要有NMUDPI(收发数据的控件)、n ̄mo1(输 图2系统主界面 入要发送的信息)、Memo2(显示别人发来的信息)、关闭按 String s dept,s_employee; 钮和发送按钮如图3,主要代码集中在发送按钮和NMUDPI的 lnt I_deptno i_employeeno; 数据接收事件中。 TTreeNode Root_Node, New_dep ode, {New emp_node; inti_emp_count:O: TreeViewl一>Items一>Clear《): Root_Node:TreeViewl一>Items一>Add(NULL, 中国石 油天然气管道局 l; T dept一>First《 ): Root_Node=TreeView1一>Items一>Item【0】: for(inti=1:i<=T_dept一>RecordCount;i++) {s_dept=T-dept一>FieldByName(,de}pt )一>AsString; i_deptno:T ept一>FieldByName( Dept_No )一>Aslnte— ger; New_dept_node=TreeViewl一>Items一>AddChitd (Root_Node,s-dept): New_dept』ode一>Imagelndex:0: 图3聊天窗口 New-dept_node一>Selectedlndex:1: T_employee一>First《): (1)发送功能实现 i_emp_count=T employee一>RecordCount; 发送功能主要任务是将发送数据信息(包括序号、发送者 StatusBar1一>Panels一>Iterns【O】一>Text= 共有 + 姓名、发送时间、数据内容、接收者姓名等)记录到数据库, IntToStr(i_emp_count)+ 位用户. ; PThisNodelnfo=newTNodeData; 将接收标志IsReceived设为N(表示接收者未成功接收),然 后初始化NewMsgNo、MsgHead(数据头,包含发送者姓名、 56 电 20 0 8.醢11砖与j|| i …… _E删0RI&C0啊啊U_lC盯ION…………………………………………………………………………………* 发送主机IP、发送时间等)、MsgContent等信息,最后用 SendBuffer方法将合并后的SendStifng发送到网络,代码如下。 charReqCode【2000】: AnsiString SendString MsgHead,MsgContent; int NewMsgNo; FormJ11ain一>T.rnsg一>Refresh(): Form_main一>T_msg一>Last(): NewMsgNo=FOrm.』11a{n一>1‘J_nsg一>FieldByName一 Ms— gNo ̄)一>Aslnteger+1: SendString Memol一>Lines一>Text: Form_main一>T_msg一>Append() Formrealn一>TJnsg一>FieldByName( MsgNo )一>As‘ _Integer=NewMsgNo Form_main一>T』nsg一>FieldByName《 Sender )一>As。 String=Form上ogin一>AS_SenderName: F0rm』 ain一>1。』nsg一>FieldByName( SendDate )一> .AsString=DateTimeToStr(Now《)} FormJnain一>丁Jnsg一>FieldByName《 content )一>As’ String=SendString; Form_main一>T』nsg一>FieldByName( Receiver,)一>As— String=Form—main一>AS eceiverName; Form_main一>丁Jnsg一>FieldByName( IsReceived }一> AsString= N : Form_main一>T. sg一>Post(): MsgHead=FOrm_Login一>AS_SenderName+ l + Form_Login一>AS SenderlP 4- 】 -4DateTimeToStrINow 、 MsgContent=Memo1一>Lines一>Text; SendString=MsgHead+ :@ +MSgContent -4 @ +Int- ToStr(NewMsgNo): StrCoPY(ReqCode,SendString.c_str()): NMUDP1一>SendBuffer《ReqCode,2OOO,2000): (2)数据接收功能实现 在NMUDPI一直监控数据接收端口,当有数据到来时触 发OnDataReceived(数据接收)事件。此事件的代码主要将接收 的数据分解出NewMsgNo、MsgHead、MsgContent等信息,将数 据头及数据信息显示在Memo2中,最后将对应的数据库中记 录接收标志置为“Y”,更新Receivedate。 AnsiString MsgHead。MsgContent; //消息头包括姓名、IP地址、时间等信息 int NewMsgNo ArriveBits; charArriveCharI2000】。~: NIVIUDP1一>ReadBuffer(ArriveChar,2000.ArriveBits): MsgContent=StrPas(ArriveChar): NewMsgNo=StrTolnt(MsgContent.SubString (MsgContent.LastDellmiter( @ )+1 MsgContent.Length ())) MsgContent:MsgContent.SubString {1,MsgContent.LastDetimiter( @ }一1}; MsgHead=MsgCon e1 .SubString f1 MsgContent.LastDelimiter( )一1): MsgContent;MsgContent.SubString (MsgContent.LastDelimiter @ )+1_MsgContent.Length {)): Memo2一>Lines一>Add《MsgHead): Memo2一>Lines一>Add《MsgContent): MIlemol一>Lines一>Clear(): Form jmaiQueryl Close _ n 一> 一> ():Fform _main 一> Query1 一> SQL 一 Clear () FIorm_main一>Query1一>SQL.->Addf updatemy_msgset 、sReceived: Y .ReceivedDate t 4- DateTimeToStr(Now{))+ where MsgNo: +IntToStr (NewMsgNo)): FOrm main一>Query1一>ExecSQL{): 4.离线消息接收功能实现 在现实的企事业单位中,员工不可能实时在线,因此为保 障能对离线用户发送信息以及离线用户进入系统后能正常查收 未读信息,需要将其他用户发来的本人未阅读信息显示出来, 并将这些信息的接收标志IsReceived项设置为Y,初始化Re— ceivedDate接收日期项,具体代码如下。 醑l_‘爵滞圉瞌_ 。|。C●l蟹珊I 诩 ∈曝鞲 薯 a l 主利民2008.8.1 4 1 7:46:49你今天看奥运比赛了吗 王利民2008.8.14 17:49:49我看了体操比赛-中国又拿了j 团体冠军? 』 { ; { l 。 礤 虱 I | l|美韫 \1 图4未读信息窗口 nti - StringIs_msg;l F0rm_main一》Q-weidu一>Close(); 0 Form main一>Q_weidu一>SQL一>Clear();j ForrT1-main一>Q ̄eidu一>SQL一>Add( select}from my_msg 、1 | F0rmj_nain一>Q,weidu一>SOL一>Add( where IsRe- ceived= N andReceiver;~+Form_Login一》 AS_SenderName 、 Fom1-rna{n一>Q_weidu一>ExecSOL() F0rm_main一>O ̄eidu一>Prepare《): f:=ormJT1ain一>O ̄eidu一>Open(}: for(inti=1:j《=F0rm-main一》Q_weidu一>BecordCount; 、 {Is_msg=Form ̄ain一>Q_weidu一>FieldByName 《"Sender")一>AsString 一 Is ̄sg=\s_msg七Form_main一>Q_weidu 》FieldBy- Name ‘SendDate ̄)一>AsStri (下转第64页) 一, …’ . 实用第一 智慧密 集 …… ^l_ ’ … …№ … , … …。 %叠加在伪量化图像上以对图像进行边缘勾勒 C=repmat(1一E,【1 1 31). Q: %使用1一E而不是E的原因:强边缘对应的E值大,弱边缘 %对应的E值小,由于我们希望在强边缘出勾勒出黑色的线 %条,所以使用了1一E而不是E 六、结论 采用Matlab7.0(release R 14)做为开发工具,在Windows XPSP2环境下编译通过了上述代码。图4是部分试验结果图, 可以看出,输出的图像确实具有类似手工水彩画绘制的效果。 双向线性滤波和亮度的伪量化相当于手工水彩作画中的大 色块和大片色处理,而强边缘勾勒则相当于手工水彩画中细节 刻画。这种直觉上的理解通过公式(1)和(2)进行了形式化 (b)输出的水彩画效果 图4彩色图像的水彩画效果 说明,最终通过计算机自动生成的输出图像在视觉上具有类似 手绘水彩的效果。 参考文献 1 C.Tomasi and R.Manduchi.Bilateral Filtering for Gray and Color Images.In Proceedings of the IEEE International Conference on Computer Vision,1998,pP:839—846. 2 Holger Winnemoller,Sven C.Olsen,and Bruce Gooch.Real— Time Video Abstraction.In Proceedings of ACM SIGGRAPH, 2006. (a)输入的原始图像 (收稿日期:2008年lO月9日) (上接第57页) (上接第52页) IS msg:lS msg+ +FO r『n main一>Q weidu一>Field— ByName( content )一>AsString; 八、结语 Memol一>Lines一>Add《Is_msg): 以上DataGrid控件在系统开发中的运用,也是一个典型系 F0rm main一>Q _weidu 一> Next ():)统中的一个模块分解,在各个系统中,如图书馆管理系统、物 Form_main一>Q weidu一>Close() Form main一>Q weidu一>S;QL一>Clear(): 资管理系统、学生档案管理系统均有对数据的基本操作部分, F0rn1main一>Q_weidu一>SQL一>Add( updatemy_msg 因此利用以上代码,借鉴到其他系统可以很轻松地完成,减轻 —setlsReceived= Y where Receiver: +Form 程序员编程的压力,当然这只是开发系统中很小的一个部分, _Login 一>AS SenderName+…): 仍然还有更多的功能与代码等待着读者去思索与编写。 Form main一>Q weidu一>ExecSQL(): 以上为融合网络与数据库编程技术设计和开发即时通信系 参考文献 统的主要思想与实现过程。在此程序基本架构的基础上,在实 1易福华编著.Visual Basic典型系统实战与解析.电子工业 际的开发过程中,还可以根据具体的需求进行功能拓展与完 出版社,2007.1. 善,如增加多线程处理机制、增加数据流传输功能等。本文所 2马艳红.关系数据库的VB通用查询编程技巧.电脑编程技 研究的是即时通信类程序的最典型最具代表性的内容,对企事 巧与维护,2008.1. 业单位开发和建设即时通信系统有重要的参考作用。 f收稿日期:2008年9月16日) f收稿日期:2008年10月8日) 函 与难 ‰