《网络聊天编程》ppt课件

上传人:xiao****1972 文档编号:73863052 上传时间:2019-01-26 格式:PPT 页数:36 大小:1.95MB
返回 下载 相关 举报
《网络聊天编程》ppt课件_第1页
第1页 / 共36页
《网络聊天编程》ppt课件_第2页
第2页 / 共36页
《网络聊天编程》ppt课件_第3页
第3页 / 共36页
《网络聊天编程》ppt课件_第4页
第4页 / 共36页
《网络聊天编程》ppt课件_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《《网络聊天编程》ppt课件》由会员分享,可在线阅读,更多相关《《网络聊天编程》ppt课件(36页珍藏版)》请在金锄头文库上搜索。

1、第8章 网络聊天编程,第一部分 应用实践,8.1 为应用系统加入Socket支持,8.2 编写聊天模块前的准备,8.3 编写聊天模块代码,第二部分 知识点链接,L8.1 为应用系统加入Socket支持,L8.2 编写聊天模块代码,第8章 网络聊天编程,系统功能:单击菜单中的“交谈”“对话”,弹出“对话(Socket聊天)”对话框,单击“谁在线上”可以搜索工作组中所有用户的计算机名,双击一个计算机名,该计算机名即显示在左边文本框中,单击空白文本区,单击“我要上线”可上线等待来自其他用户发送的数据并在文本框中显示,否则不能接收消息,但能够给已上线的用户发送消息。,图8.1 双方聊天,第一部分 应用

2、实践,8.1 为应用系统加入Socket支持 为MFC程序加入Socket支持一般有两种方法,第一种是在用MFC AppWizard(exe)创建一个单文档应用程序时,在向导的第4步选中Windows Sockets,如图8.2所示。,图8.2 Windows Sockets支持,8.1 为应用系统加入Socket支持,为MFC程序加入Socket支持一般有两种方法,第一种是在用MFC AppWizard(exe)创建一个单文档应用程序时,在向导的第4步选中Windows Sockets,如图8.2所示。 (1)打开工程,切换到FileView,双击打开头文件StdAfx.h,在其中加入一行:

3、 #include / MFC socket extensions (2)mpr.lib这个库里面封装了Windows Networking(Wnet)函数,这是一组网络控制函数,比如可以利用这些函数来列举局域网内所有机器名称,IP地址以及其他相关信息。为了使用这些函数需要在StdAfx.h中加入一行: #pragma comment(lib,“mpr“) (3)切换到ClassView,打开CXSCJApp下的InitInstance函数,在函数体最前面添加如下代码以初始化Sockets: BOOL CXSCJApp:InitInstance() if (!AfxSocketInit() /

4、 是否初始化成功 AfxMessageBox(“Windows通信端口初始化失败“); return FALSE; ,8.2 编写聊天模块前的准备,(1)设置界面如图8.3所示,新建对话框,设置标题为Sockets聊天,ID为IDD_P2PCHAT,并在菜单上添加相应的项如“对话”,并编写弹出本对话框的命令代码。,图8.3 “设置Socket聊天”对话框,8.2 编写聊天模块前的准备,添加“对话”菜单项ID_P2PCHAT的COMMAND消息到CXSCJView类中,代码如下: void CXSCJView:OnP2pchat() / TODO: Add your command handle

5、r code here CDlgP2P myDlgP2P; myDlgP2P.DoModal(); 在XSCJView.cpp中添加头文件: #include “DlgP2P.h“ (2)设置接收文本框IDC_SHOWSTR控件的属性设置如图8.4(左)所示,设置发送文本框IDC_SENDSTR的属性如图8.4(右)所示。,图8.4 设置编辑框的Styles属性,8.2 编写聊天模块前的准备,(3)打开列表控件的属性对话框,将“查看”选为“小图标”,利于网络聊天时各在线用户名的完全显示。单击编排(Layout)测试(Test)后显示界面如图8.5所示。,图8.5 聊天模块界面,8.3 编写聊天

6、模块代码,(1)为对话框新建类CDlgP2P,为控件添加关联变量如图8.6所示。,图8.6 设置控件关联变量,8.3 编写聊天模块代码,(2)在对话框类CDlgP2P 的头文件DlgP2P.h中加入变量和函数声明。 class CDlgP2P : public CDialog / Construction public: CDlgP2P(CWnd* pParent = NULL); / standard constructor CString GetIP(CString username); / 得到目标机器IP void GetName(char Temp64); / 取得本机名 bool

7、connectFlag ; / 网络连接标识 void ShowRecvData(); / 显示接收的数据 void GetLanActiveComputer(); / 获取本地活动计算机机器名称 ;,8.3 编写聊天模块代码,(3)在DlgP2P.cpp文件中加入全局变量如下: static int CreatedFlag=0; / 是否已建立服务器 SOCKET m_socket,m_hSocket; / 建立套接字描述符 sockaddr_in m_addr; / sockaddr_in结构为套接字储存套接字地址信息 sockaddr_in m_raddr; sockaddr_in m_

8、caddr; char *message=NULL; / 聊天内容接收框中的消息变量 char *name=NULL; / 聊天内容接收框中的主机名变量 int nItem; / CList控件中显示内容(主机名)的序号 CString changstr; / 中间变量 CString strname; / 同上 UINT AcceptThread(LPVOID lpvoid);/ 接收线程 SOCKET m_cSocket; / 客户端Socket,8.3 编写聊天模块代码,(4)取得本机名。 void CDlgP2P:GetName(char Temp64) / 取本机(Local Mac

9、hine)的主机名(即Windows中的本机计算机名) gethostname(Temp,64); (5)添加WM_INITDIALOG消息,用本机用户名初始化全局变量changstr。 BOOL CDlgP2P:OnInitDialog() CDialog:OnInitDialog(); / TODO: Add extra initialization here char localname64; GetName(localname); changstr=localname; return TRUE; / return TRUE unless you set the focus to a c

10、ontrol / EXCEPTION: OCX Property Pages should return FALSE ,8.3 编写聊天模块代码,(6)在DlgP2P.cpp中添加GetLanActiveComputer函数,用枚举的方法找到局域网里所有打开的机器。 该函数的实现代码中用到了几个枚举网络资源的函数,其中包括:WnetOpenEnum函数、WnetEnumResource函数和WnetCloseEnum函数。 (7)根据计算机名得到IP地址。 CString CDlgP2P:GetIP(CString username) CString hostaddr; struct host

11、ent *hostname=gethostbyname(username); for(int i=0;hostname!=NULL ,8.3 编写聊天模块代码,(8)创建ShowRecvData(),该函数负责将接收到的数据显示在文本接收框中。 void CDlgP2P:ShowRecvData() CString tempstr; tempstr=“; if(name!=NULL (9)编写线程AcceptThread,作用是接收来自多个客户端的连接并发送数据。该线程参数为OnCreathost()传来的对话框指针,根据该指针可以对聊天对话框中显示接收数据的IDC_SHOWSTR文本框进行操

12、作。,8.3 编写聊天模块代码,(10)为“我要上线”按钮添加OnCreathost()事件。编写代码时,需要用到许多Sockets编程常用函数,包括:sockets()、bind()、listen()、connect()、accept()、send()、recv()和closesockets。 主要功能是打开Socket,绑定IP和端口号,开始监听,启动线程AcceptThread接受数据。,8.3 编写聊天模块代码,(11)为ListCtrl控件IDC_USER添加双击事件NM_DBLCLK。 void CDlgP2P:OnDblclkUser(NMHDR* pNMHDR, LRESULT

13、* pResult) / TODO: Add your control notification handler code here POSITION pos; m_showname.SetWindowText(“); nItem=0; pos=m_List.GetFirstSelectedItemPosition(); / 取第一个选择项的positon if(pos=NULL) return ; else while(pos) / 如果用户选择了多项,则取最后选择的一项 nItem=m_List.GetNextSelectedItem(pos); m_name=m_List.GetItem

14、Text(nItem,0); UpdateData(FALSE); / 传到“发送计算机”编辑框中,方向是变量到控件 *pResult = 0; ,8.3 编写聊天模块代码,(12)为“谁在线上”按钮添加BN_CLICKED事件,该事件负责将双击事件传来的用户名加入文本框IDC_SENDNAME中。 void CDlgP2P:OnFinduser() / TODO: Add your control notification handler code here CString strTemp; strTemp=“请稍候.“; m_FindBtn.SetWindowText(strTemp);

15、m_List.DeleteAllItems(); / 先清空原来显示的计算机名列表 GetLanActiveComputer(); / 再次取得局域网中的计算机名 Sleep(1000); / 程序冻结1000ms,获取计算机名时避免其他操作 strTemp=“谁在线上?( (13)为按钮IDC_SENDBUTTON添加OnSend事件,作用是根据文本框IDC_SENDNAME传入的用户名,选择服务端,创建发送套接字,向指定计算机发送消息。,第二部分 知识点链接,L8.1 为应用系统加入Socket支持 L1. Socket Socket的数据传输是一种特殊的I/O,Socket也是一种文件描

16、述符。Socket具有一个类似于文件打开的函数调用Socket,该函数返回一个整型的Socket描述符,随后建立连接,数据传输等操作都是通过该Socket实现的。 Socket分为三类:流式Socket(SOCK_STREAM),数据报Socket(SOCK_DGRAM)及原始Socket(SOCK_RAW)。流式Socket为面向连接,数据报Socket为面向无连接;原始Socket主要用于一些协议的开发和测试新的网络协议的实现,可以进行比较底层的操作,如IP的直接访问。 Windows Sockets是微软公司的网络程序设计接口,它是从BSD UNIX Socket扩展而来的。它不仅包含了BSD UNIX Socket风格的库函数,也包含了一组对Windows的扩展库函数,使程序员能

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号