11160806胡鹏.docx
《11160806胡鹏.docx》由会员分享,可在线阅读,更多相关《11160806胡鹏.docx(27页珍藏版)》请在冰豆网上搜索。
11160806胡鹏
TCP/IP与网络编程课程设计报告
班级:
网络工程1101
学号:
111608020116
姓名:
胡鹏
指导老师:
史朝阳
时间:
2014.05.30
目录
一、设计内容2
1、设计背景2
2、设计要求3
二、设计原理3
1、登录模块3
2、好友模块3
3、好友列表模块4
4、隐藏模块4
(1)登陆模块4
(2)聊天Talk模块4
三、设计过程5
1、程序设计流程及源代码5
(2)源代码6
I服务器:
6
2、调试分析过程描述14
[结论]16
参考文献17
教师评语17
一、设计内容
1、设计背景
现在的信息越来越发达,很多人都在使用QQ作为聊天工具,现根据腾讯公司的QQ聊天系统制作属于自己的聊天工具,表面上看去是仿QQ聊天系统,其实等到时机成熟可以换成属于自己的名字,相信在不远的将来在老师和同学的帮助下,在借助互联网,我们一定可以打造属于自己的聊天系统,当然系统存在着很多不足之处,需要老师的指点和帮助。
2、系统需求分析
QQ聊天系统是大家广泛喜欢经常应用到CS应用程序软件,而现在仿QQ聊天系统开发工具,是本人对其程序的深感兴趣,不但可以了解从中的业务,而且还可以加强学习以及对知识的回顾,同时也是尽快测试此聊天程序,以便和同学进行用自己的工具来交流聊天,由于好奇心促使和同学们一起来探讨此程序的开发,这样增强同学之间的互相交流,互相学习。
3、设计要求
采用客户/服务器模式,分为客户端程序和服务器端程序。
服务器采用WINSOCKI/O模型中的任一种,支持多个客户同时在线聊天。
客户端程序和服务器程序通过网络交换聊天字符串内容,服务器窗口的列表框中显示当前在线用户,支持客户端之间的私聊(可以通过服务器中转,或考虑UDP打洞直接建立端端连接)。
二、设计原理
1、登录模块
登陆模块的实现过程有下面几个步骤:
(1)初始化列表信息,获取用户名,服务器的IP地址,使按键失效
(2)确认登陆后创建套接字,绑定,监听
(3)初始化成功后,激活添加好友和隐藏功能
2、好友模块
添加好友的实现过程有下面几个步骤:
(1)弹出对话框
(2)获取对话框中的IP
(3)检查对方是否在线,建立连接
(4)发送请求验证
3、好友列表模块
(1)客户接收请求,将服务端加入列表,发送客户端信息
(2)服务端得到客户端信息,加入列表
(3)双击好友列表,弹出发送信息对话框
4、隐藏模块
(1)登陆模块
(1)隐藏与显示
(2)响应鼠标,弹出控制菜单
(2)聊天Talk模块
1、发送信息模块
聊天模块中,发送信息模块的实现过程有下面几个步骤:
(1)通过列表双击一个好友为聊天对象,弹出聊天窗口;
(2)用户按下发送按钮后,检测对方是否在线,
检测对方是否在线
(3)将聊天内容发送出去
(4)在本地即时聊天内容显示的编辑框中添加发送的内容并写入聊天记录。
2、接收信息模块
聊天模块中,接收信息模块的实现过程有下面几个步骤:
(1)由主界面判断接收到信息的类型,是否为好友发来信息,如果是,则打开聊天窗口
(2)读取消息,并写入聊天记录,
(3)载入字体颜色信息。
(4)显示聊天记录
3、聊天记录管理模块
聊天记录管理模块的实现过程有下面几个步骤:
(1)将发送内容和接收内容写入文本文件;
(2)显示聊天记录;
(3)删除聊天记录。
4、字体颜色模块
实现字体颜色模块的过程有下面几个步骤:
(1)调用系统字体,获取字体,写入存档
(2)调用系统字体颜色,获取颜色,写入存档
(3)读取、更新字体颜色。
三、设计过程
1、程序设计流程及源代码
1、mainbord界面设计
2、添加好友对话框界面
3、弹出菜单界面
4、添加图标
(2)源代码
I服务器:
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMainBordDlgdialog
CMainBordDlg:
:
CMainBordDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMainBordDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMainBordDlg)
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
//CMainBordDlgmessagehandlers
BOOLCMainBordDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
m_FriendList.SetItemHeight(0,18);
start=NULL;
last=NULL;
//TODO:
Addextrainitializationhere
GetIP_Name();
strcpy(lpszTipBefore,"QQ"+IPName);
(CEdit*)GetDlgItem(IDC_AddBTN)->EnableWindow(FALSE);
(CEdit*)GetDlgItem(IDC_MSGBTN)->EnableWindow(FALSE);
(CEdit*)GetDlgItem(IDC_PhoneBTN)->EnableWindow(FALSE);
(CEdit*)GetDlgItem(IDC_SendFileBTN)->EnableWindow(FALSE);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMainBordDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMainBordDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCMainBordDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
voidCMainBordDlg:
:
OnAddBTN()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
AddFreindmydlg;
if(mydlg.DoModal()==IDOK)
{
if(mydlg.ipstr.GetLength()==0)
{
MessageBox("您没有输入IP地址!
!
!
","错误信息",NULL);
return;
}
ip=mydlg.ipstr;
}
elsereturn;
WSADATAwsaData;
if(WSAStartup(MAKEWORD(2,1),&wsaData))//调用WindowsSocketsDLL
{
WSACleanup();
return;
}
tempSocket=socket(PF_INET,SOCK_STREAM,0);//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if(tempSocket==INVALID_SOCKET)
{
return;
}
DWORDdwip;
if((dwip=inet_addr(ip))==INADDR_NONE)
{
MessageBox("IP赋值错误","错误信息");
return;
}
tempSocketAddr.sin_family=AF_INET;//使用TCP/IP协议
tempSocketAddr.sin_port=htons(8001);
tempSocketAddr.sin_addr.S_un.S_addr=dwip;
if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr))==SOCKET_ERROR)
{
MessageBox("对方不在线","添加失败",NULL);
return;
}
else
{
msg.sign=6;
strcpy(msg.msg,IPName);
}
if(send(tempSocket,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR)
{
MessageBox("发送消息失败","错误信息",MB_OK);
return;
}
}
LRESULTCMainBordDlg:
:
OnRead(WPARAMwParam,LPARAMlParam)
{
if(!
IsTrue)
{
//m_List.InsertString(0,"有数据到达,但是没有工作站连接。
");
}
CStringstr;
switch(WSAGETSELECTEVENT(lParam))
{
caseFD_READ:
if(recv(Client,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR)
{
//m_List.InsertString(0,"接收数据发生错误。
");
return0;
}
SelectWay();
//m_History_List.InsertString(0,str);
//MessageBox(str);
break;
caseFD_CLOSE:
str=_T("工作站退出。
");
//m_List.InsertString(0,str);
closesocket(Client);
//IsTrue=FALSE;
break;
}
return0L;
}
return0L;
}
voidCMainBordDlg:
:
SendMsg()//接受或发送系统请求信息
{
WSADATAwsaData;
if(WSAStartup(MAKEWORD(2,1),&wsaData))//调用WindowsSocketsDLL
{
WSACleanup();
return;
}
tempSocket=socket(PF_INET,SOCK_STREAM,0);//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if(tempSocket==INVALID_SOCKET)
{
return;
}
DWORDdwip;
if((dwip=inet_addr(ip))==INADDR_NONE)
{
MessageBox("IP赋值错误","错误信息");
return;
}
tempSocketAddr.sin_family=AF_INET;//使用TCP/IP协议
tempSocketAddr.sin_port=htons(8001);
tempSocketAddr.sin_addr.S_un.S_addr=dwip;
if(connect(tempSocket,(LPSOCKADDR)&tempSocketAddr,sizeof(tempSocketAddr))==SOCKET_ERROR)
{
MessageBox("对方不在线","失败信息",NULL);
return;
}
strcpy(msg.msg,SystemMessage);
if(send(tempSocket,(char*)&msg,sizeof(msg),0)==SOCKET_ERROR)
{
MessageBox("发送消息失败","错误信息",MB_OK);
return;
}
}
voidCMainBordDlg:
:
OnHidebtn()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
TrayAddIcon();
ShowWindow(SW_HIDE);
}
LRESULTCMainBordDlg:
:
OnTestNotifyIcon(WPARAMwParam,LPARAMlParam)
{
switch(lParam)
{
caseWM_LBUTTONDBLCLK:
if(wParam==DEMOICON)
{
ShowWindow(SW_SHOW);
}
break;
caseWM_RBUTTONDOWN:
if(wParam==DEMOICON)
{
CMenu*pm1,m2;
CPointpp(LOWORD(lParam),HIWORD(lParam));
m2.LoadMenu(IDR_MENU1);
pm1=m2.GetSubMenu(0);
ClientToScreen(&pp);
pm1->TrackPopupMenu(TPM_RIGHTALIGN|TPM_LEFTBUTTON,
pp.x,
GetSystemMetrics(SM_CYSCREEN)-50,this);
}
break;
default:
break;
}
return0L;
}
voidCMainBordDlg:
:
OnSubmenu1()
{
ShowWindow(SW_SHOW);
}
II客户端:
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
/////////////////////////////////////////////////////////////////////////////
//CFileTransferDlgdialog
CFileTransferDlg:
:
CFileTransferDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CFileTransferDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CFileTransferDlg)
m_FileName=_T("");
m_FileSize=_T("");
m_Name=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
/////////////////////////////////////////////////////////////////////////////
//CFileTransferDlgmessagehandlers
BOOLCFileTransferDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemme