第6章 传输应用编程:即时通讯聊天工具_第1页
第6章 传输应用编程:即时通讯聊天工具_第2页
第6章 传输应用编程:即时通讯聊天工具_第3页
第6章 传输应用编程:即时通讯聊天工具_第4页
第6章 传输应用编程:即时通讯聊天工具_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第6章

传输应用编程:即时通讯聊天工具6.1即时通讯系统6.2传输层的技术6.3原理、流程与协议设计6.4系统实现6.5源代码清单本章教学目的、要求掌握即时通信聊天工具所采用的系统架构方式。了解即时通信聊天工具实际采用的传输技术。掌握即时通信聊天工具的原理、流程与协议设计以及实现过程。本章教学重点及难点即时通信聊天工具的原理、流程与协议设计以及实现过程。6.1 即时通讯系统6.1.1生活中的即时通讯大家经常接触到的有:腾讯QQ、淘宝的阿里旺旺、百度Hi、飞鸽传书以及国外的MSN、Skype等等。6.1.2系统架构的方式曾提到还有另一种混合型P2P,它需要索引服务器协调才能正常工作(如图6.3)。6.2传输层的技术6.2.1同步与异步TCP同步TCP实现机制简单、编程方便、代码的可读性好,唯一的缺点是:通信的一方往往不得不为了等待对方做出响应而阻塞线程,降低了程序执行的并发程度。异步TCP能很好地达到并行执行的效果,缺点是要运用特殊的实现机制,编程难度较高。6.2.2匿名UDP要创建匿名UDP的套接字对象,使用UdpClient类的这个构造函数:publicUdpClient(intport)用此构造函数创建一个基础socket,系统自动分配合适的本地IPv4地址,将port参数指定为0,表示让系统自动为其分配一个合适的端口号。典型应用代码如下:

UdpClientsendUdpClient=newUdpClient(0); byte[]sendbytes=Encoding.Unicode.GetBytes(message); IPEndPointremoteIPEndPoint=… sendUdpClient.Send(sendbytes,sendbytes.Length,remoteIPEndPoint); sendUdpClient.Close();6.2.3实名UDP要创建实名UDP套接字对象,使用下面的构造函数: publicUdpClient(IPEndPointlocalEdp)用此构造函数创建一个新的UdpClient实例,该实例与包含本地IP地址和端口号的IPEndPoint实例绑定。典型的应用代码为: //创建实名套接字 IPAddresslocalIp=IPAddress.Parse(textBoxLocalIp.Text); localIPEndPoint=newIPEndPoint(localIp,int.Parse(textBoxLocalPort.Text)); UdpClientreceiveUdpClient=newUdpClient(localIPEndPoint); //启动接收线程 ThreadthreadReceive=newThread(ReceiveMessage); threadReceive.Start();6.2.4各种传输技术的适用场合实际采用的传输技术一般有3种:同步TCP、匿名UDP和实名UDP。同步TCP用于需要可靠传输少量重要数据的场合;匿名UDP用来发消息;实名UDP则主要负责接收消息并代表接收方用户线程自身。6.3原理、流程与协议设计6.3.1会话流程设计按照上述思路,设计系统会话流程如下:(1) 用户通过终端进入系统,向服务器发出消息,请求登录。(2) 服务器收到请求后,向客户端返回应答消息,表示同意接受该用户加入,并顺带将自己服务线程所在的监听端口告诉用户端。(3) 客户端按照服务器应答中给出的端口号与服务器建立稳定的连接。(4) 服务器通过该连接将当前在线用户的列表信息传给新加入的客户端。(5) 客户端获得了在线用户列表,就可以自主地与线上其他用户通信了。(6) 当用户退出系统时要及时地通知服务器。6.3.1会话流程设计整个流程如图6.4所示。6.3.2用户管理新用户登录时,服务器将用户表传给他,同时向系统内每个成员广播“login”消息,各成员收到后更新自己的用户表,如图6.5所示。6.3.2用户管理在有用户退出系统时,服务器也会及时地将这一消息传达给每个用户,当然,这也就要求每个用户在自己想要退出之前,必须要先“告知”服务器一声(用“logout”消息),见图6.6。6.3.3协议设计1.客户端与服务器会话(1) 登录过程①

客户端用匿名UDP向服务器发出: login,username,localIPEndPoint②

服务器收到后以匿名UDP返回应答: Accept,port③

连上服务器、获取用户列表用户列表的格式: username1,IPEndPoint1;username2,IPEndPoint2;…;end(2) 注销登录用户退出时,向服务器发出消息: logout,username,localIPEndPoint6.3.3协议设计2.服务器协调管理用户(1) 新用户加入通知服务器向系统内用户广播发送: login,username,remoteIPEndPoint(2) 用户退出与新成员加入时一样,服务器将用户退出的消息直接进行广播转发: logout,username,remoteIPEndPoint6.3.3协议设计3.用户终端之间聊天聊天时发送的信息格式为:

talk,longTime,selfUserName,message如图6.7为大家熟悉的QQ聊天内容的显示方式,其中②标出的就是以长时间格式显示的时间信息。6.4系统实现6.4.1界面设计1.服务器端界面服务器界面遵循简洁的风格,拥有一个大的黑色显示屏,便于监控程序运行的状态,如图6.8所示。6.4.1界面设计程序工程名为“Server”,其界面控件的属性描述见表6-1所示。Name控件类型功能描述MainFormForm服务器程序主窗体listBoxStatusListBox服务状态监控区textBoxServerIpTextBox填写服务IP地址textBoxServerPortTextBox服务端口号buttonStartButton【启动】按钮buttonStopButton【停止】按钮6.4.1界面设计2.客户端界面客户端模仿QQ设计为狭长形窗体,包括三个区域:上部为登录/配置区,中部是用户列表显示区,下部为状态监控区。状态监控同样采用ListBox控件,与服务器端的一样设置为黑色类似Dos命令行的显示区,见图6.9。6.4.1界面设计程序工程名为“Client”,界面上各控件的属性见表6-2。Name控件类型功能描述MainFormForm客户端程序主窗体textBoxServerIpTextBox服务器IPtextBoxServerPortTextBox填写服务器端口textBoxLocalIpTextBox本地IPtextBoxLocalPortTextBox本地端口textBoxUserNameTextBox填写用户名buttonLoginButton【登录】按钮buttonLogoutButton【注销】按钮listViewOnlineListView在线用户列表显示区listBoxStatusListBox状态监控区6.4.1界面设计需要向客户端项目工程中添加一个窗体。右击项目名,从弹出的快捷菜单中选择【添加】→【Windows窗体…】,如图6.10的操作。6.4.1界面设计在弹出的【添加新项】对话框中为窗体命名为ChatForm.cs,单击【添加】按钮,完成添加,如图6.11所示。6.4.1界面设计在新出现的窗口设计工作区中,设计聊天子窗口界面如图6.12所示6.4.1界面设计界面上各控件的属性见表6-3。Name控件类型功能描述ChatFormForm聊天子窗体richTextBoxTalkInfoRichTextBox聊天内容显示区textBoxSendTextBox发送文本编辑区buttonCloseButton【关闭】按钮buttonSendButton【发送】按钮6.4.2服务线程系统运行后,先由服务器启动服务线程,操作很简单,只须单击【启动】按钮即可。【启动】按钮的事件过程。【停止】按钮的事件过程: privatevoidbuttonStop_Click(objectsender,EventArgse) { myTcpListener.Stop(); receiveUdpClient.Close(); buttonStart.Enabled=true; buttonStop.Enabled=false; }6.4.2服务线程运行服务器,先后单击【启动】和【停止】按钮,状态监控屏上就显示出服务线程的工作状态,如图6.13所示。6.4.3登录/注销1.用户对象为了便于服务器对全体用户的管理,在服务器工程中添加自定义User类,步骤类似于前述的向工程中添加Windows窗体,如图6.14所示。添加完之后工程目录树中会新增一个名为User.cs的源文件,在其中编写User类的定义代码。6.4.3登录/注销2.用户登录功能用户在客户端界面上单击【登录】按钮后,客户端就向服务器发出“login”请求。【登录】按钮的事件过程为。连接成功后,启动一个专门的线程threadGetList用于获取用户列表,该线程关联的GetUserList()方法的实现代码。6.4.3登录/注销图6.15所示为第一个用户登录系统时,从状态监控屏幕上看到的客户端与服务器程序的会话过程。6.4.3登录/注销3.用户注销当用户需要下线退出时,单击客户端界面上的【注销】按钮。【注销】按钮的过程代码: privatevoidbuttonLogout_Click(objectsender,EventArgse) { //匿名发送

sendUdpClient=newUdpClient(0); //启动发送线程 ThreadthreadSend=newThread(SendMessage);

threadSend.Start(string.Format("logout,{0},{1}",textBoxUserName.Text,clientIPEndPoint));

AddItemToListBox(string.Format("发出:[logout,{0},{1}]",textBoxUserName.Text,clientIPEndPoint));

receiveUdpClient.Close(); //关闭UDP套接字

listViewOnline.Items.Clear();

buttonLogin.Enabled=true;

buttonLogout.Enabled=false;

this.Text="Client"; }6.4.3登录/注销在这个过程中,退出的客户端与服务器的会话记录如图6.16框出的部分。6.4.3登录/注销4.更新用户列表系统内的在线用户收到服务器发来的广播通告后,实时更新自己的用户列表。当服务器发来“login”通知时,说明有新成员加入,客户端执行代码段④:AddItemToListBox(string.Format("新用户{0}({1})加入",splitString[1],splitString[2]));stringuserItemInfo=splitString[1]+","+splitString[2];AddItemToListView(userItemInfo);若收到的是“logout”,则执行代码段⑤:AddItemToListBox(string.Format("用户{0}({1})退出",splitString[1],splitString[2]));RmvItemfromListView(splitString[1]);两个回调方法定义。6.4.4即时聊天在线用户的即时聊天是本章软件最重要的核心功能,携带聊天谈话内容的消息以“talk”为首部,采用点对点(P2P)方式发给对方。“talk”消息的发送、接收和显示都由专门的聊天子窗口负责,当客户端主程序收到“talk”打头的消息时,先执行代码段⑥: for(i

温馨提示

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

评论

0/150

提交评论