




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于TCP的简单一对一聊天程序设计一、课程设计目的1、通过课程设计,使学生理论联系实际,在实践中进一步了解计算机网络体系结构,深入理解TCP/IP参考模型2、培养学生分析、解决问题的能力,提高学生动手能力。3、使学生掌握搜集资料、调查研究、整理报告的方法。4、初步掌握网络应用程序开发技术以及互联网的应用技术。二、课程设计的要求及原理1、课程设计要求。实现一个一对一的聊天程序。其基本过程如下:服务器首先启动,创建套节字等待客户连接;客户启动以后,创建套届字,然后和服务器建立连接;连接建立以后,客户机和服务器可以通过建立的套节字连接进行通信。服务器和客户端可以是一台电脑上的两个进程,也可以使分别部
2、署在两台电脑上。2、课程设计原理。 客户服务器模型。它是指客户/服务器模型是所有网络应用的基础。客户/服务器分别指参与一次通信的两个应用实体,客户方主动地发起通信请求,服务器方被动地等待通信的建立。它是一个在建立分布式应用时最常用的范例。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一
3、方被不可改变地认为是主机,而另一方则是从机。无论具体的协议是对称的或是非对称的,当服务被提供时必然存在"客户进程"和"服务进程"。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被"惊醒"并且为客户提供服务对客户的请求作出适当的反应。虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。相关协议。应用到的网络协议主要有TCP协议。TCP协议被称作一种端对端协议。这是因为它为两台计算机之间
4、的连接起了重要作用:当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。即使在 Internet 暂时出现堵塞的情况下,TCP也能够保证通信的可靠。IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。三、设计方案首先本程序的定位是一对一的聊天程序;程序没有采用图形界面;程序的设计语言采用的是C+;基于winsock;开发工具为VC+。聊天程序的设计可以采用UDP或者TCP,程序采
5、用TCP。采用的是客户服务器模型。在本程序中,一个用户作为Server端,另一个用户作为Client端。也就是说,作为Server端的用户,需要首先启动程序,等待Client端的连接请求。Client端自动建立连接请求。当TCP连接握手以后,双方方可进行交互。在客户端用户进行消息的编写,发送和接受等功能;而服务器端发送的消息向客户端所有的用户进行发送可以称之为系统消息;服务器端收到某一个用户发送的消息之后可以向所有的其它用户进行转发。连接断开之后,断开服务的客户端将不能够收到服务器转发的消息。程序可在同台机器上或者是不同机器上运行。在用C+语言进行代码的编写时主要应用到的是C+中的网络编程、输
6、入输出处理、多线程以技术。数据的传输使用的是I/O输入输出处理,用到类似cout<<"string"等的输出处理方法。因为服务器是一只提供服务的,也就是说服务器一直是运行的状态,时刻等待着新的客户端提出连接请求,所以就需要使用到多线程的方法。Socket类的实例的accept方法是一个阻塞式的方法,如果只是用进程来表示新的客户端,那么在现有进程没有结束的情况下,新的客户端在发送连接请求之后程序将不能继续向下执行,所以应该应用比进程更小的线程来解决这一问题。四、程序编写1、客户端与服务器端用到的相关类class CIPMessagepublic:CIPMessag
7、e();CIPMessage();void Init(string sIpAddress, int iPort);int SendMessagePort(string sMessage);int RecMessagePort();bool IsConnected()return m_bIsConnected;private:bool m_bIsConnected; / true - connected false - not connectedstring m_sServerIPAddress;int m_iServerPort;SOCKET conn; / socket connected
8、to server;class CChatServerpublic:CChatServer();CChatServer();bool IsConnected()return m_bIsConnected; / 返回连接状态void StartListenClient(); / Listen to clientint SendMessagePort(string sMessage); / 向所有客户端发消息int RecClient(SOCKET sRecSocket); /接收客户端数据private:bool m_bIsConnected; / true - connected false
9、- not connectedint m_iServerPort;list<SOCKET> m_vClientList; / All socket connected to clientSOCKET m_SClient;SOCKET m_SListenClient; / socket listening for client calls;2、服务器端程序#include "server.h"CChatServer CServerObj;UINT ServerRecThread(LPVOID pParam) /接收数据的工作线程.UINT ServerListen
10、Thread(LPVOID pParam) /监听端口建立连接的工作线程.CChatServer:CChatServer() /对象CChatServer的构造函数 . m_SListenClient=socket(AF_INET,SOCK_STREAM,0);/创建一个套接字,返回套接字描述字 . if(bind(m_SListenClient,(sockaddr*)&local,sizeof(local)!=0) /把本地协议的地址赋予一个套接字 . if(listen(m_SListenClient,10)!=0)/监听该端口 .CChatServer:CChatServer()
11、 /对象CChatServer的析构函数 closesocket(m_SListenClient);/关闭该端口 WSACleanup();void CChatServer:StartListenClient() . m_SClient=accept(m_SListenClient, (struct sockaddr*)&from,&fromlen);/产生与客户进行TCP连接通信的套接字并返回已连接客户端的协议地址 .AfxBeginThread(ServerRecThread,(void *)m_SClient);/启动接收线程,用m_SClient套接字与客户端通话int
12、 CChatServer:SendMessagePort(string sMessage)/向各个客户端发送服务器数据 .for(itl = m_vClientList.begin();itl != m_vClientList.end();itl+)iStat = send(*itl,sMessage.c_str(),sMessage.size()+1,0); .int CChatServer:RecClient(SOCKET sRecSocket)/接收客户端数据成员函数.iStat = recv(sRecSocket,temp,4096,0);if(iStat = -1)elseSendM
13、essagePort(temp);.return 0;int main(int argc, char* argv) .if(!CServerObj.IsConnected()/判断监听端口是否建立.AfxBeginThread(ServerListenThread,0);/启动监听端口建立连接的工作线程 while(gets(buf) .if(CServerObj.SendMessagePort(buf).3、客户端程序#include "client.h"/Global Message objectCIPMessage MyMessObj;CIPMessage:CIPMe
14、ssage()/MyMessObj构造函数.void CIPMessage:Init(string sIpAddress, int iPort)/建立与服务器端得连接.conn=socket(AF_INET,SOCK_STREAM,0);/建立客户端套接字.addr=inet_addr(m_sServerIPAddress.c_str();/转化ip地址和端口为指定形式hp=gethostbyaddr(char*)&addr,sizeof(addr),AF_INET);.if(connect(conn,(struct sockaddr*)&server,sizeof(serve
15、r)/向指定服务器建立连接.m_bIsConnected = true;return;CIPMessage:CIPMessage()/MyMessObj析构函数.int CIPMessage:SendMessagePort(string sMessage)/向指定服务器发出数据.iStat = send(conn,sMessage.c_str(),sMessage.size()+1,0);.int CIPMessage:RecMessagePort()/接收指定服务器数据.iStat = recv(conn,acRetData,4096,0);.UINT MessageRecThread(LP
16、VOID pParam)/接收指定服务器数据线程.int main(int argc, char* argv).FILE *fp = fopen("server.ini","r");/获取服务器端套接字地址.while(fgets(buf,4096,fp) != NULL).sServerAddress = buf;fclose(fp);.MyMessObj.Init(sServerAddress.c_str(),8084);/启动与服务器连接.AfxBeginThread(MessageRecThread,0);/开启接收数据线程while(gets(
17、buf).if(MyMessObj.SendMessagePort(buf)/向服务器发送数据.五、运行结果测试时在同一机器上运行的,有一个服务器和两个客户端。上图为服务器端程序运行结果客户端运行结果六、实习心得和体会通过本次计算机网络课程设计,我对计算机网络这门课有了更深入的理解与认识。了解了winsock编程技术,对于TCP协议有了更深入的理解。我明白了对网络通讯程序的设计的原理和过程的透彻理解,是网络通讯程序的前提。我在代码编写的时候,使用了集成开发工具vc+,所以编程的效率相对较高。这个聊天程序只是实现了基本的功能,而且并没有提供较为友好的图形界面。通常,网络应用程序包含两个独立的应用程序:客户程序和服务器程序。但是,也可以设计同时完成这两种功能的程序,例如,一些服务器程序如果不能完成一个服务请求时,它将转而充当客户程序,向其它服务器程序请求信息。通过这次的课程设计,我明白了很多。我知道自己在实践动手能力方面还有很大欠缺,做出能够聊天的程序增加了我对网络编程的兴趣。我也认识到了自己在编程方面的很多不足,对整个协议栈的了解还不太清晰,以后得总结一下这方面的知识。 我会更加努力,平时注重提高自己的实践动手能力
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 信息系统监理师学习规划试题及答案
- 道路货物运输与新能源车辆推广考核试卷
- 计算机四级考试独特试题及答案汇集
- 网络技术在各行业中的应用现状试题及答案
- 装饰石材的表面装饰技术与效果考核试卷
- 软件测试工程师复习经验交流试题及答案
- 传输层协议的关键特征试题及答案
- 奥尔夫实训室管理制度
- 公司客房维修管理制度
- 行政组织理论考试新趋势试题及答案
- 成语故事半途而废
- GB/T 7233.1-2009铸钢件超声检测第1部分:一般用途铸钢件
- GB/T 545-1996海军锚
- GB/T 3683-2011橡胶软管及软管组合件油基或水基流体适用的钢丝编织增强液压型规范
- GB/T 17766-1999固体矿产资源/储量分类
- GB/T 1094.1-2013电力变压器第1部分:总则
- 汤谷良全面预算整合企业管理
- 颊癌病人的护理查房
- 社会稳定风险分析调查问卷(企业或社会团体)
- 2021译林版英语四年级下册期末知识点复习课件
- iFIAE全自动多参数流动分析仪使用说明书-20201110doc
评论
0/150
提交评论