《TCP聊天系统大作业.pdf》由会员分享,可在线阅读,更多相关《TCP聊天系统大作业.pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、编编 号号2 2 2 2期期末末大大作作业业题目:题目:基于 TCP/UDP 的聊天室系统物联网工程学 院计算机科学与技术专 业学号学生姓名仲其龙指导教师杨路二一三年五月1摘要摘摘 要要课题是基于 TCP/UDP 协议编写聊天室系统。聊天室系统主要包括注册、登陆、群聊、单聊、显示在线人员和退出功能。系统主要包括客户端、服务器端和客户显示端。其中客户端与服务器端的连接基于 TCP 协议,服务器端向客户显示端发送数据是基于 UDP 协议。课题是网络协议栈中传输层的应用,在网络成的基础上,在传输层中使用网络套接字,达到数据传送的目的,从而实现聊天室系统功能。关键词:TCP/UDP;聊天室;网络套接字
2、;数据传送2目录目目录录摘 要.2目录.31 原理.41.1TCP.41.2UDP.41.3 流程图.52 关键代码.63 实验结果.114 小结.133TCP/IP 协议与网络编程期末大作业1 1 原理原理1.1 TCP1.1 TCP在面向连接的数据流(SOCK_STREAM)传输过程中,设计基于 TCP/IP 协议的程序是传输层使用 TCP 协议,它的最大的特点是在通信之前要在客户和服务器之间先建立连接,在数据传输完成后要关闭连接,释放网络资源。面向连接的客户/服务器程序工作模型如下:WSAStartup()socket()bind()listen()accept()WSAStartup(
3、)socket()等待客户连接请求用三次握手建立连接connect()recv()交换数据send()send()recv()closesocket()关闭TCP连接WSAClenaup()closesocket()WSAClenaup()面向连接的客户/服务器程序工作模型1.2 UDP1.2 UDP无连接的数据报(SOCK_DGRAM)传输服务在传输层使用的协议时UDP 协议。与面向连接的通信协议过程不同,它的最大的特点就是必须要在客户和服务器之间建立连接,通信的任何一方可以先发送数据,这样首先发送数据的一方就成为客户端,而接收数据的一方就是服务器端。在数据传输完毕后,只要关闭套接口,释放网
4、络资源,通信过程就结束了。无连接的数据包传输服务通信是,客户端与服务器端所使用的函数是类似的。面向无连接的客户/服务器程序工作模型如下:4TCP/IP 协议与网络编程期末大作业WSAStartup()WSAStartup()socket()socket()bind()bind()recvfrom()交换数据recvfrom()sendto()交换数据sendto()closesocket()closesocket()WSAStarup()WSAStarup()无连接的客户/服务器程序工作模型1.31.3 流程图流程图基于 TCP/UDP 的聊天室系统包括客户端、客户显示端和服务器端三部分。功能
5、主要是注册、登陆、群聊、单聊、显示在线人员和退出。客户端与服务器端的连接协议基于TCP 协议,服务器端发送功能基于 UDP 协议。客户端与服务器端建立连接后,客户端进行操作,将数据发送至客户显示端。客户显示端建立客户端建立客户端建立显示连接信息建立连接连接显示注册信息处理注册注册显示登录信息处理登录数据传输登录显示单聊显示群聊显示在线数据传递处理单聊处理群聊处理显示在线单聊群聊显示在线退出程序退出程序退出程序程序流程图5TCP/IP 协议与网络编程期末大作业2 2 关键代码关键代码Client:Client:/建立套接字,建立连接ifif(WSAStartup(MAKEWORD(2,2),),
6、&wsaData)!=!=0)cerr Failed to load Winsock.endl;returnreturn 0;sClient=socket(AF_INET,SOCK_STREAM,0););ifif(sClient=INVALID_SOCKET)cerr socket()Failed:WSAGetLastError()()endl;returnreturn 0;ser.sin_family=AF_INET;ser.sin_port=htons(iport););ser.sin_addr.s_addr=inet_addr(SERVER_IP););/服务器IP/conection
7、 the serverifif(connect(sClient,(sockaddr*)&*)&ser,sizeofsizeof(ser)=-1)cerr !无法连接 endl;returnreturn 0;elseelse cout !连接成功 endl;/用户注册cout !您将进行注册 endl;cout name;cout password;ifif(name=|password=)cout !无效输入 endl;breakbreak;sendstr=;sendstr=sendstr+1+name+#+password+$+ipaddressstr6TCP/IP 协议与网络编程期末大作业
8、isend+*+msg+0;/message to be sent=send(sClient,sendstr.c_str(),(),sendstr.size(),(),0););/用户登录cout !您将进行登陆n name;cout password;sendstr=;Sendstr=sendstr+2+name+#+password+$+ipaddressstr+*+msg+0;/message to be sentisend=send(sClient,sendstr.c_str(),(),sendstr.size(),(),0););/群聊whilewhile(true)cout nam
9、e msg;ifif(msg=:home|msg=:HOME)breakbreak;sendstr=;Sendstr=sendstr+3+name+#+password+$+ipaddressstr+*+msg+0;/message to be sentisend=send(sClient,sendstr.c_str(),(),sendstr.size(),(),0););/显示在线人数sendstr=;Sendstr=sendstr+5+name+#+password+$+ipaddressstr+*+msg+0;/message to be sentisend=send(sClient,s
10、endstr.c_str(),(),sendstr.size(),(),0););cout numperson;whilewhile(true)cout name msg;ifif(msg=:home|msg=:HOME)breakbreak;sendstr=;sendstr=sendstr+6+name+#+password+7TCP/IP 协议与网络编程期末大作业$+ipaddressstr+*+numperson+msg+0isend=send(sClient,sendstr.c_str(),(),sendstr.size(),(),0)/显示在线人数Sendstr=Sendstr=se
11、ndstr+5+name+#+password+$+ipaddressstr+*+msg+0/message to be sentisend=send(sClient,sendstr.c_str(),(),sendstr.size(),(),0)SERVER:SERVER:/创建监听套接字,监听事件ifif(WSAStartup(MAKEWORD(2,2),),&wsaData)!=!=0)cerr WSAStartup Failed WSAGetLastError()()endlreturnreturn 0/创建流式套接字 sSocket=socket(AF_INET,SOCK_STREAM
12、,0)c1=socket(AF_INET,SOCK_DGRAM,0)ifif(sSocket=INVALID_SOCKET|c1=INVALID_SOCKET)cerr socket()Failed WSAGetLastError()()endlreturnreturn 0/将套接口s置于”非阻塞模式 ser.sin_family=AF_INET ser.sin_port=htons(iport)ser.sin_addr.s_addr=inet_addr(SERVER_IP)ifif(bind(sSocket,(sockaddr*)&*)&ser,sizeofsizeof(ser)=SOCKE
13、T_ERROR)cerr bind()Failed WSAGetLastError()()endlreturnreturn 0/进入监听状态ifif(listen(sSocket,5)=SOCKET_ERROR)cerr listen Failed WSAGetLastError()()endlreturnreturn 0/创建事件对象 NewEvent=WSACreateEvent()()8TCP/IP 协议与网络编程期末大作业ifif(NewEvent=WSA_INVALID_EVENT)cerr WSACreateEvent()Failed WSAGetLastError()()endl
14、;returnreturn 0;/网络事件注册int WESerror=WSAEventSelect(sSocket,NewEvent,FD_ACCEPT|FD_CLOSE););ifif(WESerror=INVALID_SOCKET)cerr WSAEventSelect()Failed WSAGetLastError()()endl;returnreturn 0;/等待事件对象int nIndex=WSAWaitForMultipleEvents(n,eventArray,FALSE,WSA_INFINITE,FALSE););/网络事件查询WSAEnumNetworkEvents(so
15、ckArray nIndex-WSA_WAIT_EVENT_0,NULLNULL,&event););WSAResetEvent(eventArray nIndex-WSA_WAIT_EVENT_0););ifif(event.lNetworkEvents&FD_ACCEPT)!=!=0)/处理FD_ACCEPT通知消息 ifif(event.iErrorCode FD_ACCEPT_BIT =0)sNew=accept(sockArray nIndex-WSA_WAIT_EVENT_0,(struct sockaddr*)&*)&cli,&ilen););cout 【:IP:inet_nto
16、a(cli.sin_addr)连接成功】endl;/处理注册ifif(mnamelogout.count(namestr)=1)/existed ipaddresscout 【namestr :IP:ipadress 用户名已经注册】endl;elseelse/not existedcout 【namestr :IP:ipadress 注册成功】endl;int iSend=sendto(c1,sendstr.c_str(),(),sendstr.size(),(),0,(SOCKADDR*)&*)&cli,sizeofsizeof(cli););/处理登陆ifif(mnamelogout.c
17、ount(namestr)=1)9TCP/IP 协议与网络编程期末大作业/existed ipaddressifif(mnamesocket.count(namestr)=1)cout 【namestr :IP:ipadress 登陆成功】endl;elseelse ifif(mpwlogout namestr =passwordstr)cout 【namestr :IP:ipadress 登陆成功】endl;elseelse cout 【namestr :IP:ipadress 密码错误】endl;elseelse/not existedcout 【namestr :IP:ipadress
18、尚未注册】endl;/处理群发ifif(mnamesocket.count(namestr)=1)cout 【namestr :IP:ipadress :msg】endl;elseelse cout 【namestr :IP:ipadress 尚未登陆】endl;forfor(map:iterator it=mnamesocket.begin();();it!=!=mnamesocket.end();();+it)/群发信息int iSend=sendto(c1,sendstr.c_str(),(),sendstr.size(),(),0,(SOCKADDR*)&*)&cli2,sizeofs
19、izeof(cli2););elseelse ifif(recvstr 0=4)/处理退出ifif(mnamesocket.count(namestr)=1)cout 【namestr :IP:ipadress 断开连接】endl;1 0TCP/IP 协议与网络编程期末大作业 mnamesocket.erase(namestr););/单发信息int iSend=sendto(c1,sendstr.c_str(),(),sendstr.size(),(),0,(SOCKADDR*)&*)&cli,sizeofsizeof(cli););/处理非法断开连接ifif(event.iErrorCod
20、e FD_CLOSE_BIT=10053)forfor(map:iteratorit=mnamesocket.begin();();mnamesocket.end();();+it)ifif(it-second=sockArray nIndex-WSA_WAIT_EVENT_0)it!=!=cout 【-first :IP:-first 断开连接】-first););breakbreak;closesocket(sockArray nIndex-WSA_WAIT_EVENT_0););WSACloseEvent(eventArray nIndex-WSA_WAIT_EVENT_0););3 3
21、 实验结果实验结果CLIENT:CLIENT:11 1 1TCP/IP 协议与网络编程期末大作业CLEINT(SERVER):CLEINT(SERVER):SERVER:SERVER:1 2TCP/IP 协议与网络编程期末大作业4 4 小结小结如今计算机网络已经渗透到我们生活中各个角落,我们可以从网络中获取大量的信息,网络极大方便我们的生活,如何学会网络编程已经成为计算机专业人员必须学习的过程。本课题的目的正是让我们熟悉 TCP/IP 的连接建立、数据传递和连接释放的数据传送过程,在传输层中利用网络套接字达到数据传送的目的。课程主要是小型聊天系统的建立,包括网上注册、登陆、群聊、单聊和退出,这是网络系统的小型模型,映射整个网络系统。在开发的过程中遇到很多程序的bug,这需要不断地完善和更改。在课题完成的过程中,从整个框架的建立,过程中,需求不断地改变,每一个阶段不断地完善,向前迭代。了解的不仅是网络协议的应用,同时,也锻炼的了我们的项目开发能力和团队协作能力。同时,如何利用有限的资源和如何合理的分配时间,都是此次课程设计所学习的东西。13 1 3TCP/IP 协议与网络编程期末大作业1 4