TCPIP 网络聊天课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《TCP/IP和网络编程》课程设计
题目:网上聊天
姓名
学号
指导教师
二零一零年月日
一、系统功能描述
使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。当然,聊天时可以启动多个客户端。服务器支持多个主题,进入服务器后可选定主题,启动客户端后,输入服务器的IP地址即可。用户聊天必须处于同一个主题中。
二、系统的模块划分
服务器端:
CAboutDlg:生成关于的对话框类
CCChatServerApp:对应用程序进行初始化
CCChatServerDoc、CCChatServerView:一份文档可以有多个相关的视图,当用户在文档上打开一个窗口时,框架创建一个视图并将其与文档连接。
CClientSocket:设置非阻塞,将前台的界面处理和后台的网络通信都整合到消息传递模型。获取输入的用户名,聊天室列表。
CINIFILE:可以读取.修改变量数值,可以设置新的组,新的变量
CMainFrame:创建应用程序主窗口,使之以树菜单保持展开状态
CMyFormView:在程序中应用窗体,可将新窗体插入。
CMyTreeView:将聊天室列表以树形排列,并实现用户发送消息的方法。
CParseMessage:实现信息的传输。
CServerSocket:实现多个客户端的登录。
CSetServerPortDlg:设定连接的端口。
Message:建立一个结构体,设定房间名、用户名、以及发送内容的类型和长度。
客户端:
CChatClientApp:实现客户端与服务器端的连接。
ChatClientDoc:从服务器端获取聊天室内房间的名称的文本。
CClientFormView:初始化房间的名称。
CClientLog:显示上次登录的用户名的对话框。
CConnectServerDlg:客户端与服务器端的连接的对话框。
CIniFile:读取当前目录下的ini文件。
CShowMessage:显示其他客户端发送的消息。
CParseMessage:用户登录时的所选择登陆端口,IP,用户名的对话框。
CMyTreeView:客户端上显示的树形列表,以及可实现发送消息头像闪动等。三、调试数据
首先启动服务器端
分别启动两个客户端,用户名为A 、B
将两个用户进入同一频道
A向B发送消息
B收到消息
回复A发送的消息
A收到B的消息
四、主要代码
客户端:if(!m_skMainSocket.Create())
{
AfxMessageBox("端口创建错误");
return FALSE;
}
int iTryTimes = 0;
CString strName;
if(!IniFile.Create("username.ini",1))
{
AfxMessageBox("初始化文件不存在");
return FALSE;
}
CString strServerIp;
int iServerPort;
IniFile.GetVarStr("USERNAME","DEFUALTNAME",strName);
if(!IniFile.GetVarStr("SERVERIP","DEFUALTSERVERIP",strServerIp))
{
strServerIp = _T("127.0.0.1");
}
if(!IniFile.GetVarInt("SERVERPORT","DEFAULTSERVERPORT",iServerPort)) {
iServerPort = 1080;
}
while(iTryTimes < 3)
{
CConnectServerDlg Dlg(strName,strServerIp,iServerPort);
if(Dlg.DoModal() == IDCANCEL)
return FALSE;
if(!m_skMainSocket.Connect(Dlg.m_strServerIp,Dlg.m_iServerPort))
{
if(MessageBox(NULL,"服务器连接错误","重试?",IDRETRY) == IDNO)
{
// ExitInstance();
return FALSE;
}
iTryTimes ++;
}
else
{
Message msObj;
msObj.iType = FIRSTLOG;
msObj.iSubType = FIRSTTIME;
CString strTemp = Dlg.m_strUserName;
int iLen = strTemp.GetLength();
lstrcpy(msObj.strName,_T(strTemp.GetBuffer(iLen)));
strTemp.ReleaseBuffer();
m_skMainSocket.Send(&msObj,sizeof(Message));
m_skMainSocket.SetUserName(strTemp);
return TRUE;
}
if(iTryTimes >=3)