




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
潘滨湖北师范学院本科毕业论文即时通讯系统的实现完成时间:2008-2-102008-4-28指导老师:方斌即时通讯系统的实现引言:网络在人们的生活中所扮演的角色越来越重要,我们可以借助网络进行网上购物、网上求医问药、网上求助、网上银行、网上报名等。我们的人际关系网也可以在网上进行,人们可以通过这个空间进行网络聊天,实现彼此沟通,交换信息,甚至网络聊天工具在部分人的生活中大有与传统的电话通信手段同等重要的趋势,那么这些网络聊天工具是如何实现的呢?本文从最简单的两个示例出发,阐述了当今最流行的即时通讯系统的基本功能。摘要:本文阐述了即时通讯的基本原理,并通过具体的示例来辅助说明。关键字:即时通讯 多线程 网络编程 socket tcp/udp(一) 类QQ聊天软件聊天功能就是在线双方互相传递信息功能,它包括一般文字传输和文件传输两部分。聊天信息显示在聊天窗口中时,包括:发送信息,接收信息。发送信息是指自己发送给对方的信息,接收信息是指来自对方的信息。一.登录界面设计 如下所示:主要步骤:1.启动vc6.0,选择工程-MFC(.EXE),选择基于对话框,其他默认。2.在对话框上放置如图所示的控件。3.选择“建立类向导”,为两个编辑框关联两个变量m_qq和m_pwd.4.响应登录按钮,编写OnLogin()函数 代码如下:UpdateData();/接收数据if(m_qq=)MessageBox(用户名不能为空,MB_OK);else if(m_pwd=)MessageBox(密码不能为空);else if(m_qq!=2155 | m_pwd!=2155)MessageBox(没有该用户,请核对);else if(m_qq=2155 & m_pwd=2155) AfxMessageBox(welcom!); CDialog:OnOK(); CListDlg udlg; udlg.DoModal(); UpdateData(FALSE);/初始化数据5.为了美化界面,特地加载了一幅位图作为背景,注意选种“通知”,否则当对话框移动时将无法重绘。另外,所有其他的空间都必须选择“透明”的属性。6.另一个技术在于属性表的创建,我在这里是用vc6.0提供的组件完成的。选择工程添加到工程companents and controlsPropertySheet,然后通过向导的方式来建立属性表。二用户列表界面 如下所示主要步骤:1. 插入一个对话框的资源,然后建立ClistDlg类2. 插入菜单资源,并加入到对话框中3. 响应“聊天”菜单消息,此时创建的应该是一个非模态的对话框,也就是必须在堆上分配内存。代码如下:void CListDlg:OnChat() / TODO: Add your command handler code hereCMy10Dlg *pDlg=new CMy10Dlg;pDlg-Create(IDD_MY10_DIALOG);pDlg-ShowWindow(SW_SHOW);三聊天窗口既功能实现 如图所示:这是本程序最主要的代码区,也是主功能区主要步骤:1. 在StdAfx.h中添加,这一步主要是加载套接字库和进行版本协商,注意:它加载的是1.1版本的,其功能类似与 SOCKET API 中的WsaStartUp(),其实它内部也还是要调用WsaStartUp()的,但是你不用去插入WS2_32.lib。2. 在 对话框上放置相关控件,并关联上相关变量3. 在主对话框的InitInstance()函数中去调用一下AfxSocketInit()(加载套接字)4. 在聊天对话框中加入一个成员函数用来初始话套接字通过class wizard来完成 SOCKET InitSocket(),代码如下:BOOL CMy10Dlg:InitSocket() m_socket=socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addsock; addsock.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addsock.sin_family=AF_INET; addsock.sin_port=htons(2000); bind(m_socket,(SOCKADDR*)&addsock,sizeof(SOCKADDR);return TRUE;可以看到,这里完成了套接字的创建和绑定两步。5. 然后在该对话框的OnInitDialog()中调用InitSocket()函数/以上主要是套接字的创建和初始化,接下来编写接收端程序6. 为了编写出一个非阻塞的网络聊天程序,应该采用多线程技术。首先编写一个结构体,以便把窗口的句柄和套接字描述符两个参数传给该线程。如下所示:struct RECVPARAMSOCKET sock; HWND hwnd;然后在OnInitDialog()中创建线程,代码如下:RECVPARAM *pRecvParam=new RECVPARAM;pRecvParam-sock=m_socket; pRecvParam-hwnd=m_hWnd;HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL); CloseHandle(hThread);7. 接下来开始编写线程函数 ThreadProc(),它是一个回调函数,它不属于任何一个对象,那么可以写成一个全局函数的方式来编写,但是如果要完全按照面向对象的思想来编程的话,可以将它定义为 static 定义:static DWORD WINAPI RecvProc(LPVOID lpParameter);实现代码:DWORD WINAPI CMy10Dlg:RecvProc(LPVOID lpParameter) SOCKET sock=(RECVPARAM*)lpParameter)-sock; HWND hwnd=(RECVPARAM*)lpParameter)-hwnd; SOCKADDR_IN addFrom; int len=sizeof(SOCKADDR); char recvBuf200; char tempBuf300; int retval; while(TRUE) retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR *)&addFrom,&len); if(SOCKET_ERROR=retval) break; CString strtime; CTime time=GetCurrentTime();strtime=time.Format(%H:%M:%S); sprintf(tempBuf,%s:rn%s: t%s,strtime,inet_ntoa(addFrom.sin_addr),recvBuf); :PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf); 上面用到一个自定义消息:PostMessage()函数,因此必须严格按照自定义消息的三步走,在类的头文件中定义消息值,在消息映射宏中写上消息映射,然后编写消息响应代码,代码如下:void CMy10Dlg:OnRecvData(WPARAM wParam,LPARAM lParam) CString str=(char*)lParam; CString strtemp;GetDlgItemText(IDC_EDIT_RECV,strtemp);/str+=strtime;str+=rn;str+=strtemp; SetDlgItemText(IDC_EDIT_RECV,str);8. 响应发送按钮的OnSend()函数,IP地址由IP地址控件获得,也可以通过扫描IP的方式获得,但实现起来较为困难。void CMy10Dlg:OnSend() / TODO: Add your control notification handler code hereDWORD dwIP;(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1)-GetAddress(dwIP);SOCKADDR_IN addrto;addrto.sin_addr.S_un.S_addr=htonl(dwIP);addrto.sin_family=AF_INET;addrto.sin_port=htons(2000); CString strsend;GetDlgItemText(IDC_EDIT_SEND,strsend);sendto(m_socket,strsend,strsend.GetLength()+1,0,(SOCKADDR*)&addrto,sizeof(SOCKADDR);SetDlgItemText(IDC_EDIT_SEND,);9. 为了美化界面,修改了相关控件的背景色和字体颜色,但是按钮的背景色和字体颜色实现起来却很困难,由于本人技术有限,时间仓促,未能实现。相关代码如下:HBRUSH CMy10Dlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);/ TODO: Change any attributes of the DC hereif(pWnd-GetDlgCtrlID()=IDC_STATIC_RECV)pDC-SetTextColor(RGB(0,255,0);pDC-SetBkMode(TRANSPARENT);return m_brush;if(pWnd-GetDlgCtrlID()=IDC_STATIC_SET)pDC-SetTextColor(RGB(255,0,0);pDC-SetBkMode(TRANSPARENT);return m_brush;10if(pWnd-GetDlgCtrlID()=IDC_EDIT_SEND)pDC-SetTextColor(RGB(255,255,0);pDC-SetBkColor(RGB(0,0,100);return m_brush;if(pWnd-GetDlgCtrlID()=IDC_EDIT_RECV)pDC-SetTextColor(RGB(255,255,0);pDC-SetBkColor(RGB(0,0,100);return m_brush;/ TODO: Return a different brush if the default is not desiredreturn hbr;/return m_brush;说明:该通讯系统由于接收端和发送端都在同一个程序中,所以只要在每一台电脑中安装该程序,然后输入对方的IP地址,就可以与他/她进行聊天。编译运行结果:如下所示此外,还可以对两个编辑框的背景进行设置。用户点击背景设置选取自己喜欢的背景色。(二)TCP方式的文字聊天工具该系统分为客户端和服务器端,其基本原理同上,只不过它是面向连接的基于字节流的网络通讯。一 服务器端基本实现(主界面)1. 同样在对话框的InitInstance()中,加载AfxInitSocket()2. 然后进入OnInitDialog()中创建套接字代码如下:BOOL CCSocketDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE);/ Set small icon/ TODO: Add extra initialization herecount=0;m_list.InsertColumn(0,);m_list.SetColumnWidth(0,435);m_edit.SetLimitText(99);for (int i=0;iGetMainWnd();msgcount=dlg-getcount();if (msgcount=-1)loop=0;if(loop)s=1;dlg-msgsockmsgcount=accept(dlg-sock,(sockaddr*)&(dlg-serv),&(dlg-addlen);if (dlg-msgsockmsgcount=INVALID_SOCKET)dlg-m_edit.SetWindowText(Error accept);elseAfxBeginThread(thread,0);dlg-SetForegroundWindow();dlg-m_list.InsertItem(dlg-count+,);dlg-m_list.InsertItem(dlg-count+,inet_ntoa(dlg-serv.sin_addr);dlg-m_list.Scroll(size);dlg-m_button.EnableWindow(TRUE);while(s!=SOCKET_ERROR)s=recv(dlg-msgsockmsgcount,buff,100,0);dlg-SetForegroundWindow();if (s!=SOCKET_ERROR)dlg-m_list.InsertItem(dlg-count+,buff);dlg-m_list.Scroll(size);dlg-sendtoall(dlg-msgsockmsgcount,buff);send(dlg-msgsockmsgcount,Disconnected,100,0);dlg-m_list.InsertItem(dlg-count+,Disconnected)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院疫苗接种安全管理与环境消毒手
- 经典名著《生于忧患死于安乐》翻译与赏析
- 钢铁厂环境健康安全管理体系建设
- 安防监控系统维护手册
- 导热油炉设备标准操作流程
- 智能制造培训课程讲义与考核题库
- 地缘政治竞争与跨国公司战略-洞察及研究
- 快速迭代提升转化策略-洞察及研究
- 网红经济生态构建-洞察及研究
- 生物安全标准制定-洞察及研究
- 生产运营销售管理优化项目销售预测优化设计方案
- DB65╱T 3953-2016 反恐怖防范设置规范 商业场所
- 整形医院前台接待标准化流程与话术设计
- 完整的离婚协议书打印电子版(2025年版)
- 尿道狭窄的治疗与护理
- 2025年人教部编版小学三年级语文上册全册单元测试题及答案(全套)
- 某写字楼物业管理方案
- 2025年贵州磷化(集团)有限责任公司招聘笔试参考题库含答案解析
- 迈克尔杰克逊课件
- 三农直播培训
- 专利转化合同范本
评论
0/150
提交评论