长春大学课程设计纸共12页第1页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊目录一.设计内容…………………………………………………………………21.设计目的……………………………………………………………22.设计要求………………………………………………………………2二.设计原理…………………………………………………………………2三.设计过程…………………………………………………………………31.程序设计流程及源代码………………………………………………32.调试和分析过程描述…………………………………………………83.结果测试……………………………………………………………11四.设计总结…………………………………………………………………12五.参考文献…………………………………………………………………12一.设计内容此次网络与通信课程设计的题目是——TCP聊天室,目的在于通过我们学习的一些关于网络通信方面的知识,实现简单的TCP聊天功能,简单的来说,就是实现客户端连接服务器,并且可以实现简单的会话功能。我们都知道,当今世界正处于信息时代,电脑和网络已经普及到每个家庭中,聊天对于我们这些大学生来说,早已经成为家常便饭。可是对我们来说,设计这个简单的程序,需要的知识有很多,我们选择使用基于socket的局域网通信技长春大学课程设计纸共12页第2页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊术,它可以运行在各种使用TCP/IP协议作为通讯协议的网络上。1.设计目的综合运用本门课程所学的知识以及计算机网络的相关知识,设计一个简单的可以世界客户端和服务器的通信程序,以VisualC++作为开发平台,通过实践复习巩固课堂所学的理论知识,提高对所学知识的综合应用能力。2.设计要求此次设计的功能性要求如一下几个方面所示:(1)配置文件支持功能:使用配置文件存储程序配置信息,如监听的端口号等。(2)服务器功能:能够根据命令行参数进入服务器模式,监听端口并接受用户连接。(3)客户端功能:能够根据命令行参数进入客户端模式,主动连接服务器端进行通信。(4)聊天功能:能够互发聊天消息综合以上几点,主要就是实现客户端程序和服务器端程序通过TCP协议网络通进行简单的通信。二、设计原理服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。三、设计过程1、程序设计流程及源代码长春大学课程设计纸共12页第3页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊(1)流程图(2)源代码1)Initsock.h头文件代码#includewinsock2.h#pragmacomment(lib,WS2_32)//链接到WS2_32.libclassCInitSock{public:CInitSock(BYTEminorVer=2,BYTEmajorVer=2){//初始化WS2_32.dllWSADATAwsaData;WORDsockVersion=MAKEWORD(minorVer,majorVer);if(::WSAStartup(sockVersion,&wsaData)!=0){长春大学课程设计纸共12页第4页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊exit(0);}}~CInitSock(){::WSACleanup();}};2)TCPServer.cpp服务器端文件#include../common/InitSock.h#includestdio.hCInitSockinitSock;//初始化Winsock库intmain(){//创建套节字SOCKETsListen=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(sListen==INVALID_SOCKET){printf(Failedsocket()\n);return0;}printf(请输入要监听的端口号,按回车确认!\n);intmyport;scanf(%d,&myport);printf(端口已经设定为:%d\n,myport);//填充sockaddr_in结构sockaddr_insin;sin.sin_family=AF_INET;sin.sin_port=htons(4567);sin.sin_addr.S_un.S_addr=inet_addr(192.168.0.7);长春大学课程设计纸共12页第5页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊//绑定这个套节字到一个本地地址if(::bind(sListen,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR){printf(Failedbind()\n);return0;}//进入监听模式if(::listen(sListen,20)==SOCKET_ERROR){printf(Failedlisten()\n);return0;}//循环接受客户的连接请求sockaddr_inremoteAddr;intnAddrLen=sizeof(remoteAddr);SOCKETsClient;while(true){//接受一个新连接sClient=::accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);if(sClient==INVALID_SOCKET){printf(Failedaccept());continue;}printf(接受到一个连接:%s\r\n,inet_ntoa(remoteAddr.sin_addr));//向客户端发送数据while(true){长春大学课程设计纸共12页第6页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊charszText[]=;::recv(sClient,szText,strlen(szText),0);printf(从盖世超接收到的数据:\n\t%s,szText);if(szText[0]=='e'&&szText[1]=='x'&&szText[2]=='i'&&szText[3]=='t'){continue;}printf(\n服务器端发送的数据:\n\t);charsText[]=;scanf(%s,sText);::send(sClient,sText,strlen(sText),0);Sleep(100);//它使得CPU不会死循环}//关闭同客户端的连接::closesocket(sClient);}//关闭监听套节字::closesocket(sListen);return0;}3)TCPClient.cpp文件#include../common/InitSock.h#includestdio.hCInitSockinitSock;//初始化Winsock库intmain(){//创建套节字SOCKETs=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);长春大学课程设计纸共12页第7页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊if(s==INVALID_SOCKET){printf(Failedsocket()\n);return0;}printf(请输入要连接的服务器的端口号,按回车确认!\n);intmyport;scanf(%d,&myport);printf(端口已经设定为:%d\n,myport);//也可以在这里调用bind函数绑定一个本地地址//否则系统将会自动安排//填写远程地址信息sockaddr_inservAddr;servAddr.sin_family=AF_INET;servAddr.sin_port=htons(4567);//注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址//如果计算机没有联网,直接使用127.0.0.1即可servAddr.sin_addr.S_un.S_addr=inet_addr(192.168.0.7);if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==-1){printf(Failedconnect()\n);return0;}//接收数据while(true){charbuff[]=;printf(\n盖世超:\n\t);scanf(%s,buff);::send(s,buff,strlen(buff),0);if(strcmp(buff,exit)==0){长春大学课程设计纸共12页第8页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊break;}intnRecv=::recv(s,buff,sizeof(buff),0);if(nRecv0){buff[nRecv]='\0';printf(\n从服务器端接收到的数据为:\n\t%s,buff);}}//关闭套节字::closesocket(s);return0;}2、调试和分析过程描述开启服务器,设定端口,等待连接:长春大学课程设计纸共12页第9页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊开启客户端程序,设定端口,向服务器端发送连接请求:长春大学课程设计纸共12页第10页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊客户端向服务器端发送数据,与服务器端交互,连接通信:服务器端接收客户端通信:长春大学课程设计纸共12页第11页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊结果测试:四.设计总结通过上网查询收集资料和同学的交流,让我觉得要完成一个任务,一个人悄无声息是很难做好的,和同学交流研究会使我们获得更多,也能使自己少走许多弯路,事半功倍。这给我启示,学习一定要勇于实践,虚心请教。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!五.参考文献《Windows网络与通信程序设计》人民邮电出版社王艳平2009《VisualC++网络通信开发入门与编程实践》电子工业出版社李媛媛2008长春大学课程设计纸共12页第12页┊┊┊┊┊┊┊┊┊┊┊┊┊装┊┊┊┊┊订┊┊┊┊┊线┊┊┊┊┊┊┊┊┊┊┊┊┊《计算机网络(第5版)》电子工业出版社谢希仁2008