实现一对一的聊天程序1.docx
- 文档编号:1921843
- 上传时间:2022-10-25
- 格式:DOCX
- 页数:11
- 大小:101.27KB
实现一对一的聊天程序1.docx
《实现一对一的聊天程序1.docx》由会员分享,可在线阅读,更多相关《实现一对一的聊天程序1.docx(11页珍藏版)》请在冰豆网上搜索。
实现一对一的聊天程序1
XXXXX大学
XXXXXXXX学院
计算机网络与通信实习程设计报告
设计题目实现一对一的聊天程序
学生专业班级
学生姓名(学号)
指导教师
完成时间2010-5-20
实习(设计)地点理信学院机房112、139
2010年5月20日
一、原理概述
1、开发平台:
WindowsXP,VisualC++6.0
2、系统简单描述:
这是一个用VC做的简单的聊天系统。
在此系统中,采用TCP协议,程序分为服务器端各客户端。
系统能实现简单的聊天室功能包括一对多,而且同时也支持一对一,即私聊功能。
在系统运行中,用户可以随时更改自己的用户名。
功能虽然单一但也能够满足聊天的基本功能。
3、通信规范的制作:
程序中定义了一个结构体MYMESSAGE来作为信息传送的载体
structMESSAGE{
charflag;//作为标志来区别所发送的信息;
chardata[100];//发送的内容;
charaddr[25];//客户IP地址和端口号
};
二、设计方案
服务器端:
系统流程如下:
开始
侦听
创建套接字
绑定
接受请求
数据传输
关闭套接字
数据传输内容
增加用户信息
群聊信息
退出用户信息
私聊信息
基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。
设计思路(VC6.0下):
第一部分 服务器端
一、创建服务器套接字(create)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
第二部分 客户端
一、创建客户套接字(create)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)。
工作流程:
首先:
服务器创建了套接字后,等待新的连接,当用户连接时,服务器的用户列表里会列出客户的IP地址和端口号,本系统有聊天室和私聊两大功能。
在用户端会列出所有的客户的IP地址和端口号,用户想要与其他的用户私聊的时候,双击此用户的IP地址和端口号即可弹出私聊的对话框。
整个系统中服务器收到用户的信息并转发给其他的用户。
客户端:
系统流程如下:
创建客户套接字
关闭套接字
数据传输
与服务器连接
开始
数据传输内容
新用户登录
接受一般信息
更改用户名信息
用户退出
工作流程:
首先登录,输入服务器的IP地址与服务器的套接字连接。
当连接成功后便可以与服务器进行数据的传送,这时如果有其他的用户登录,客户端会收到服务器端转发过来的登录信息,显示有新的用户登录到聊天室,在这以后,客户可以根据自己的需要发送信息给所胡人all或者单个用户即私聊。
界面简洁,容易操作是最大的特色。
客户也可以随时更改自己的用户名,服务器会实时更新,告知所有登录聊天室的用户。
三、程序编写
主要的函数如下:
1.客户端接受线程:
UINTthread(LPVOID)
{
MESSAGEMsgBuff;
ints=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);
elseif(MsgBuff.flag=='D')//用户退出
dlg->updateList(MsgBuff.data,false);
else
dlg->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);
return0;
}
2.客户端发送函数
voidCCharClientDlg:
:
OnButtonSend()
{
MESSAGEMsgBuff;
chartext[20];
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.服务器端发送线程:
UINTthread(LPVOIDp)
{
//charbuff[100];
MESSAGEMsgBuff;
ints=1,msgcount,flag=0;
CChatDlg*dlg=(CChatDlg*)AfxGetApp()->GetMainWnd();
msgcount=dlg->getcount();
if(msgcount!
=-1){
s=1;
dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
if(dlg->msgsock[msgcount]==INVALID_SOCKET){
dlg->m_edit.SetWindowText("Erroraccept");
}else{
strcpy(dlg->ipaddr[msgcount],inet_ntoa(dlg->serv.sin_addr));
strcat(dlg->ipaddr[msgcount],":
");
sprintf(dlg->ipaddr[msgcount]+strlen(inet_ntoa(dlg->serv.sin_addr))+1,"%d",dlg->serv.sin_port);
MsgBuff.flag='A';//增加新的链接
dlg->sendList(dlg->msgsock[msgcount],MsgBuff);//把列表都发给它
dlg->updateList(dlg->ipaddr[msgcount],true);//更IP列表
strcpy(MsgBuff.data,dlg->ipaddr[msgcount]);
dlg->sendtoall(dlg->msgsock[msgcount],(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->msgsock[msgcount],(char*)&MsgBuff,sizeof(MESSAGE),0);
if(s!
=SOCKET_ERROR){
//if(strcmp(buff,"DisconnectedClient")!
=0)
if(MsgBuff.flag=='D'){//删除信息
dlg->updateList(dlg->ipaddr[msgcount],false);//发出删除信息
strcpy(MsgBuff.data,dlg->ipaddr[msgcount]);
dlg->m_list.InsertItem(dlg->count++,strcat(dlg->ipaddr[msgcount],"断开链接"));
dlg->ipaddr[msgcount][0]='\0';
inti=dlg->m_iplist.GetCount();
dlg->sendtoall(dlg->msgsock[msgcount],(char*)&MsgBuff);
}elseif(MsgBuff.flag=='P'){
for(inti=0;i<20;i++){
if(strcmp(MsgBuff.addr,dlg->ipaddr[i])==0){
break;
}
}
send(dlg->msgsock[i],(char*)&MsgBuff,sizeof(MESSAGE),0);
}else{//普通信息
dlg->sendtoall(dlg->msgsock[msgcount],(char*)&MsgBuff);
dlg->m_list.InsertItem(dlg->count++,MsgBuff.data);
}
}
}
MsgBuff.flag='D';
send(dlg->msgsock[msgcount],(char*)&MsgBuff,sizeof(MESSAGE),0);
dlg->msgsock[msgcount]=NULL;//归还套接字资源
for
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 一对一 聊天 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)