已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
XXXXX大学XXXXXXXX学院计算机网络与通信实习程设计报告 设 计 题 目 实现一对一的聊天程序 学生专业班级 学生姓名(学号) 指 导 教 师 完 成 时 间 2010-5-20 实 习(设计)地点 理信学院机房112、139 2010 年 5 月 20 日一、原理概述1、 开发平台:Windows XP, Visual C+ 6.02、 系统简单描述:这是一个用VC做的简单的聊天系统。在此系统中,采用TCP协议,程序分为服务器端各客户端。系统能实现简单的聊天室功能包括一对多,而且同时也支持一对一,即私聊功能。在系统运行中,用户可以随时更改自己的用户名。功能虽然单一但也能够满足聊天的基本功能。3、通信规范的制作:程序中定义了一个结构体MYMESSAGE来作为信息传送的载体struct MESSAGE char flag;/作为标志来区别所发送的信息;char data100;/发送的内容;char addr25; /客户IP地址和端口号;二、 设计方案服务器端:系统流程如下:开始侦听创建套接字绑定接受请求数据传输关闭套接字数据传输内容增加用户信息群聊信息退出用户信息私聊信息 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(VC6.0下): 第一部分服务器端 一、创建服务器套接字(create)。 二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。 三、接受来自用户端的连接请求(accept)。 四、开始数据传输(send/receive)。 五、关闭套接字(closesocket)。 第二部分客户端 一、创建客户套接字(create)。 二、与远程服务器进行连接(connect),如被接受则创建接收进程。 三、开始数据传输(send/receive)。 四、关闭套接字(closesocket)。工作流程:首先:服务器创建了套接字后,等待新的连接,当用户连接时,服务器的用户列表里会列出客户的IP地址和端口号,本系统有聊天室和私聊两大功能。在用户端会列出所有的客户的IP地址和端口号,用户想要与其他的用户私聊的时候,双击此用户的IP地址和端口号即可弹出私聊的对话框。整个系统中服务器收到用户的信息并转发给其他的用户。客户端:系统流程如下:创建客户套接字关闭套接字数据传输与服务器连接开始数据传输内容新用户登录接受一般信息更改用户名信息用户退出工作流程:首先登录,输入服务器的IP地址与服务器的套接字连接。当连接成功后便可以与服务器进行数据的传送,这时如果有其他的用户登录,客户端会收到服务器端转发过来的登录信息,显示有新的用户登录到聊天室,在这以后,客户可以根据自己的需要发送信息给所胡人all或者单个用户即私聊。界面简洁,容易操作是最大的特色。客户也可以随时更改自己的用户名,服务器会实时更新,告知所有登录聊天室的用户。三、 程序编写主要的函数如下:1. 客户端接受线程:UINT thread(LPVOID)MESSAGE MsgBuff;int s =1, addcount = 0;CCharClientDlg*dlg =(CCharClientDlg*)AfxGetApp()-GetMainWnd();dlg-m_connect.EnableWindow(false);dlg-m_disconnect.EnableWindow(true);while (connect(dlg-clisock, (sockaddr*)&(dlg-m_addr), sizeof(dlg-m_addr) & dlg-ee) dlg-m_edit.SetWindowText(等待.);if (dlg-ee) dlg-m_list.InsertItem(dlg-count+, 连接成功);dlg-m_send.EnableWindow(true);while (s != SOCKET_ERROR & dlg-ee) s= recv(dlg-clisock, (char*)&MsgBuff,sizeof(MESSAGE), 0);if(s != SOCKET_ERROR)if(MsgBuff.flag = A)/新用户的连接dlg-updateList(MsgBuff.data, true);else if(MsgBuff.flag = D)/用户退出dlg-updateList(MsgBuff.data, false);elsedlg-m_list.InsertItem(dlg-count+, (char*)MsgBuff.data);/while/send(dlg-clisock,D , 10,0);dlg-m_send.EnableWindow(false);dlg-m_connect.EnableWindow(true);dlg-m_disconnect.EnableWindow(false);closesocket(dlg-clisock);AfxEndThread(0);return 0;2. 客户端发送函数void CCharClientDlg:OnButtonSend() MESSAGE MsgBuff;char text20;gethostname(MsgBuff.data,10);strcat(MsgBuff.data, 说: );m_edit.GetWindowText(text, 90);strcat(MsgBuff.data, text);m_edit.SetWindowText();m_list.InsertItem(count+,MsgBuff.data);send(clisock, (char*)&MsgBuff, sizeof(MESSAGE), 0);3. 服务器端发送线程:UINT thread(LPVOID p)/char buff100;MESSAGE MsgBuff;int s = 1, msgcount , flag =0;CChatDlg *dlg = (CChatDlg*)AfxGetApp()-GetMainWnd();msgcount = dlg-getcount();if (msgcount != -1) s = 1;dlg-msgsockmsgcount = accept(dlg-sock, (sockaddr*)&(dlg-serv), &(dlg-addlen);if (dlg-msgsockmsgcount = INVALID_SOCKET) dlg-m_edit.SetWindowText(Error accept);elsestrcpy(dlg-ipaddrmsgcount, inet_ntoa(dlg-serv.sin_addr);strcat(dlg-ipaddrmsgcount, :);sprintf(dlg-ipaddrmsgcount+strlen(inet_ntoa(dlg-serv.sin_addr)+1,%d,dlg-serv.sin_port);MsgBuff.flag = A;/增加新的链接dlg-sendList(dlg-msgsockmsgcount,MsgBuff);/把列表都发给它dlg-updateList(dlg-ipaddrmsgcount,true);/更IP列表strcpy(MsgBuff.data, dlg-ipaddrmsgcount);dlg-sendtoall(dlg-msgsockmsgcount, (char*)&MsgBuff);/把新加入的用户IP发给所用用户dlg-m_list.InsertItem(dlg-count+, inet_ntoa(dlg-serv.sin_addr);dlg-m_bsend.EnableWindow(true);AfxBeginThread(thread, 0);/开始一个新的接受连接线程while (s != SOCKET_ERROR) s=recv(dlg-msgsockmsgcount, (char*)&MsgBuff ,sizeof(MESSAGE), 0);if(s != SOCKET_ERROR)/if(strcmp(buff, DisconnectedClient) != 0)if(MsgBuff.flag = D)/删除信息dlg-updateList(dlg-ipaddrmsgcount, false);/ 发出删除信息strcpy(MsgBuff.data, dlg-ipaddrmsgcount);dlg-m_list.InsertItem(dlg-count+,strcat(dlg-ipaddrmsgcount, 断开链接);dlg-ipaddrmsgcount0=0;int i =dlg-m_iplist.GetCount();dlg-sendtoall(dlg-msgsockmsgcount, (char*)&MsgBuff);else if (MsgBuff.flag = P) for (int i=0; iipaddri) = 0) break;send(dlg-msgsocki, (char*)&MsgBuff, sizeof(MESSAGE), 0);else/普通信息dlg-sendtoall(dlg-msgsockmsgcount, (char*)&MsgBuff);dlg-m_list.InsertItem(dlg-count+, MsgBuff.data);MsgBuff.flag = D;send(dlg-msgsockmsgcount, (char*)&MsgBuff,sizeof(MESSAGE) ,0);dlg-msgsockmsgcount = NULL;/归还套接字资源for (int i= 0; imsgsockmsgcount != NULL)flag = 1;if(flag != 1)dlg-m_bsend.EnableWindow(false);closesocket(dlg-msgsockmsgcount);AfxEndThread(0);return 0;四、 运行结果服务器界面如下:客户端界面如下:五、 实习心得和体会这次实验使我明白了整个网络连接,通信,断开的过程,使我增加了对网络编程的理解。增加了实际
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论