您好,欢迎访问三七文档
计算机与信息学院《计算机网络系统实践》报告2009年9月16日设计题目:局域网实时通讯工具学生姓名:学号:专业班级:计算机06-4班一、设计要求1.熟悉WinSockAPI主要函数的使用;2.掌握相应开发工具对WindowsSocketAPI的封装;3.制作基于局域网的一对一网络即时通讯工具,实现基本数据的网络传输。二、开发环境与工具WindowsXPMicrosoftVisualC++6.0三、设计原理3.1TCP/IPTCP/IP实际上是一个协议组,它不仅包括TCP协议和IP协议,还包含许多其它的协议,所有这些协议共同工作,完成Internet上的信息传递。本程序使用的是TCP/IP协议中的TCP传输控制协议(TransmissionControlProtocol),负责在应用程序之间传递数据。TCP/IP协议的核心是传输层协议(TCP、UDP)、网络层协议(IP)和物理接口层,这三层通常在操作系统的内核中实现。TCP/IP网络环境下的应用程序是通过网络系统编程界面(Socket)实现的,而Socket又利用下层的网络通信协议实现实际的通信工作.IP地址即Internet地址,通常,IP地址标识Internet网上的某一台主机。但是,TCP/IP网络实际上是将IP地址和网卡而不是主机联系起来。互连网上的每一个网卡都有一个唯一的IP地址,而一台主机可能有多个有效的IP地址,如一台计算机可能拥有几块网卡。网络协议(IP)是网络上信息从一台计算机传递给另一台计算机的方法或者协议。网络上每台计算机(主机)至少具有一个IP地址将其与网络上其他计算机区别开。IP地址通常使用点分十进制表示法,一个IP地址有32位或4个字节长点分十进制表示法将IP地址表示为一系列以圆点隔开的十进制数,其中每个数对应于一个字节3.2网络进程通信和端口(port)网络进程通信需要解决不同主机进程之间的相互通信问题。在Internet网络中,使用IP地址表示主机。同时,一台主机内的每个网络进程使用协议端口(port)进行标识。这样,要唯一确定网络环境下的某个进程,就同时需要IP地址和端口号。3.3SocketSocket是网络通信的基本构件,一个Socket对应于通信的一端。网络通信的Socket接口模型将通信主机或进程当作端点。每个网络对话包括两个端点:本地主机(或进程)和远地主机(或进程)。Socket接口将网络对话的每个端点称为一个Socket。Socket是可以被命名和寻址的通信端点,一个正在被使用的Socket都有它的类型和与其相关的进程。Socket存在于通信域中。通信域也称地址族,是为了处理一般的线程通过Socket通信而引进的一种抽象概念。Socket通常只和同一个域中的Socket交换数据(数据交换也可能跨越区域界限,但这时一定要执行某种转换)。WindowsSockets只支持单一的通信域,即Internet域(AF_INET),各种进程使用AF_INET域来进行通信。Socket可以根据通信性质分类。应用程序一般仅在同一类型的Socket之间进行通信。不过只要底层的通信协议允许,也完全可以在不同类型的Scket之间进行通信。WindowsSocket目前支持两种Socket:数据流Socket和数据报Socket。数据流Socket提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报Socket接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报Socket接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。3.4C/S模型即客户/服务器模型,在TCP/IP网络应用中,多数网络应用程序是使用客户/服务器.服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户程序提出了请求信息。此时,服务程序被“惊醒”并且为客户提供服务(对客户的请求作出适当的反应)。虽然基于连接的服务是设计客户/服务器应用程序的标准,但有些服务也是可以通过数据报Socket提供的。通常,网络应用程序包含两个独立的应用程序:客户程序和服务器程序。但是,也可以设计同时完成这两种功能的程序,例如,一些服务器程序如果不能完成一个服务请求时,它将充当客户程序,向其它服务器程序请求信息四、系统功能描述及软件模块划分服务器端分为监听和接收和发送两个模块;监听模块是由一个单独线程控制,在服务器启动后,始终监听是否有数据包发送过来。客户端分为发送和接收模块,与服务器端进行简单的数据传输。五、设计步骤5.1核心代码;5.1.1服务器端启动按钮对应代码:voidCNServerDlg::OnBtnStart(){CStringtempstr=;GetDlgItem(IDC_EDIT_PORT)-GetWindowText(tempstr);intnPort=atoi(tempstr);m_pSocket=newCListening(this);if(m_pSocket-Create(nPort)){AfxMessageBox(start!);((CButton*)(GetDlgItem(IDC_BTN_SEND)))-EnableWindow(true);if(m_pSocket-Listen())return;elseAfxMessageBox(Cannotlisten!);}}5.1.2服务器端发送按钮对应代码:voidCNServerDlg::OnBtnSend(){CStringtempstr=;GetDlgItem(IDC_EDIT_SCONTENT)-GetWindowText(tempstr);//获取需要发送的数据tempstr+=CString(\r\n);GetDlgItem(IDC_EDIT_SCONTENT)-SetWindowText();//发送完之后清空编辑框pSocket-Send(tempstr,strlen(tempstr),0);//向客户端发送数据}5.1.3客户端连接按钮对应代码:voidCNClientDlg::OnBtnStart(){CStringstrIP=;CStringtempstr=;intnPort=0;GetDlgItem(IDC_EDIT_IP)-GetWindowText(strIP);//得到用户设置的服务器ipGetDlgItem(IDC_EDIT_PORT)-GetWindowText(tempstr);//得到端口号nPort=atoi(tempstr);while(!pSocket-Connect(strIP,nPort))//连接到服务器{if(AfxMessageBox(IDS_CONNECTFAILED,MB_YESNO)==IDNO)//失败后询问是否重新连{deletepSocket;pSocket=NULL;return;}}AfxMessageBox(connectsuccess!);((CButton*)(GetDlgItem(IDC_BTN_SEND)))-EnableWindow(true);}5.1.4客户端发送按钮对应代码:voidCNClientDlg::OnBtnSend(){CStringtempstr=;CStringcsNiCheng=;GetDlgItem(IDC_EDIT_SCONTENT)-GetWindowText(tempstr);//获取要发送的数据GetDlgItem(IDC_ENICHENG)-GetWindowText(csNiCheng);//获取昵称csNiCheng+=CString(say:\r\n);tempstr=csNiCheng+tempstr+CString(\r\n);pSocket-Send(tempstr,strlen(tempstr),0);//发送数据到服务器端GetDlgItem(IDC_EDIT_SCONTENT)-SetWindowText();//发送完之后清空编辑框}流程图:图1.聊天程序流程图六、设计结果图1初始界面图2启动服务器图3客户端连接服务器图4开始聊天1.上述设计的内容,在支持一对一的客户服务器双向通信的同时,能否支持多个客户端同时与服务器通信?若不能,如何改造程序结构,使其支持这种模式?答:暂时不能。可以通过在服务器初始化的时候新建一个监听进程始终监听有没有发送过来的消息,客户端在发送消息的时候将自己的昵称也发送过来即可辨别各个客户端。2.上述客户端、服务器端成对使用,它们发送的信息、接收的信息应整合在一个程序中实现,以增加适用性。答:可以,整合在一个程序中,用户可以通过选择相应的功能来实现服务器或是客户端的功能。七、软件使用说明首先,建立Server服务器端,点击启动;然后,启动客户端,输入服务器端所在机器的IP,建立连接。即可实现一对一的双向通信,客户端可以输入自己的昵称。八、参考资料[1]高传善,钱荣松,毛迪林.数据通信与计算机网络.高等教育出版社,2003[2]郭学理,张健.网络程序设计.武汉大学出版社,2005[3]王艳平张越windows网络与通信程序设计人民邮电出版社2006九、验收时间及验收情况(注意,不允许提及自己的验收成绩)9月14号下午,由于个人原因,最后一个验收的,谢谢朱老师十、设计体会在设计一对一网络对聊工具时,要考虑到设计的人性化,在选定时成功和失败都应给出易于理解的提示,在设计聊天窗口时,可以换行,自动删除之前的输入框的记录。设计程序时要精益求精,在做好一个问题的时候,经常会带出新的问题,所以在设计初期要尽量考虑全面。
本文标题:局域网实时通讯工具
链接地址:https://www.777doc.com/doc-5530012 .html