TCPIP 网络聊天课程设计

  • 格式:doc
  • 大小:109.00 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)