实习(第6天_网络编程)_第1页
实习(第6天_网络编程)_第2页
实习(第6天_网络编程)_第3页
实习(第6天_网络编程)_第4页
实习(第6天_网络编程)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2018/2/12,聊天室程序演示CSocket程序设计基础基于Csocket的网络编程 聊天室客户端应用程序的开发聊天室服务器端应用程序扩充练习,教学内容,返 回,第6天 网络编程,2018/2/12,服务器端程序 (演示程序)客户端程序(演示程序),6.1 公众聊天室程序,返 回,2018/2/12,计算机名、IP地址和端口WinSock的工作原理服务器端的编程步骤客户端编程步骤,6.2 CSocket程序设计基础,返回目录,要点提示:,2018/2/12,计算机名、IP地址和端口,1IP地址 IP地址是一个32位的数字,用于唯一标识位于网络中的计算机。IP地址由两部分组成:网络标识和主机标识。IP地址的格式有两类:二进制和十进制格式。32位二进制的IP地址以8为单位进行分隔,换算成十进制,每个十进制数之间用“.”隔开。 例如: 10100010,1110010,1011111,10000001转化为十进制的IP地址是: 29 为了便于对IP地址进行管理,将IP地址分为5类,如图9-3所示。 2计算机名 避免输入计算机的IP地址带来的麻烦,我们可以通过计算机名来代替IP地址。,2018/2/12,计算机名、IP地址和端口(续),返回目录,3端口 在利用计算机网络进行通讯时,除利用IP地址找到指定的计算机外,还要通过端口(Port)来标识进行通讯的进程,TCP/UDP协议为每个端口都分配一个端口号,当进程通过系统调用,同一个或多个端口建立联系后,就可已通过这些端口进行数据传输了。 TCP/IP端口号有16位,因此可以有216个端口。在这216个端口中,有一些是保留端口,由权威机构分配,用于特殊目的。例如,端口80被用作超文本协议和WWW服务。保留端口外的端口为自由端口,以本地方式进行分配。,2018/2/12,利用WinSock进行有连接的通信,返回目录,使用TCP传输协议,可以与指定IP地址的主机建立连接,采用流的方式进行数据传输,优点是保证网络数据传输的可靠性,对没有到达的数据进行重传,通过效验确定数据是否正确。工作方式如图9-4所示。,2018/2/12,利用WinSock进行无连接的通信,返回目录,使用UDP数据报传输协议,可以与指定IP地址的主机发送数据,也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位,没有主次之分如图9-5所示。,2018/2/12,6.3基于CSocket的网络编程,从CSocket类派生一个新类创建一个CSocket派生类对象调用CSocket:Create()创建一个套接口,并指定端口调用CSocket:Listen()函数侦听端口在CSocket派生类中添加虚函数OnAccept() 调用CSocket:Accept()接受客户的连接请求CSocket派生类中添加虚函数OnReceive() 调用CSocket:Receive()接受数据调用Close()函数关闭为各个客户分配的读套接口。,服务器端的编程步骤:,返回目录,2018/2/12,基于CSocket的网络编程(续),创建CSocket类的派生类对象,用于连接和读写调用CSocket:Create( ) 创建一个套接口调用CSocket:Connect( )连接服务器的指定端口调用CSocket:Send( ) 发送数据在CSocket:OnReceive( )函数中进行读写操作结束通讯时,调用CSocket:Close( ) 关闭套接口,客户端的编程步骤:,返回目录,2018/2/12,9.4.1 创建工程MyWc(设置“Windows Sockets”支持)9.4.2 可视化设计用户界面(参考表9.2)9.4.3 创建一个新类CWCSock,用于与服务器通信9.4.4 接受服务器发来的数据9.4.6 建立与服务器的连接9.4.6 向服务器发送数据9.4.7 建立CMyWcDlg类与CWCSock类的关联9.4.8 处理自定义消息9.4.9 处理控件的状态,9.4 聊天室客户端应用程序,要点提示:,返回目录,2018/2/12,创建与服务器的通信类CWSock,1. 选择“Insert”菜单的“New Class”菜单项,在New Class对话框中,Bass class列表框中选取CSocket作为基类2. 单击“OK”按钮,VC+就为MyWc工程创建了一个新类CWCSocket,相应地为工程创建了两个文件WCSocket.h和WCSocket.cpp,返回目录,2018/2/12,建立与服务器的连接,void CMyWcDlg:OnConnect() UpdateData(true); /更新关联变量,如服务器名、端口号 if(!sockClient.Create() /1创建套接口 AfxMessageBox(Create WC socket failed); PostQuitMessage(0); if(!sockClient.Connect(m_server_name,m_nPort)/2连接服务器 MessageBox(连接失败!);return; m_Dat.m_bOnline=true;/标记连接成功,返回目录,2018/2/12,向服务器发送数据,void CMyWcDlg:OnSend() UpdateData(true); /更新关联变量,如要发送的信息 m_Dat.m_bOnline=true; memset(m_Dat.m_dbData,0,255); memcpy(m_Dat.m_dbData,m_send_info,m_send_info.GetLength(); strcpy(m_Dat.m_strName,m_client_name); int iSent = sockClient.Send( / 显示更新 ,返回目录,2018/2/12,接受服务器发来的数据,1. 添加虚拟函数 用MFC ClassWizard在CWCSock类中添加虚函数OnReceive()2. 读取服务器传来的数据,通知主窗口进行处理void CWCSock:OnReceive(int nErrorCode) if(Receive(,返回目录,2018/2/12,建立CMyWcDlg类与CWCSock类的关联,1. 在CMyWcDlg类中添加CWCSock类的对象,使它们相互关联。方法是在MyWcDlg.h文件中,在CMyWcDlg类定义前面添加如下语句: #include WCSock.h2. 在CMyWcDlg类定义中添加如下语句: CWCSock sockClient;,返回目录,2018/2/12,处理自定义消息,1. 在WCSock.h中,定义自定义消息,以使CWCSock能够同应用程序主窗口通信。#define RE_RECEIVED WM_USER+12在CMyWcDlg.cpp文件中,添加消息映射宏,响应CWCSock类对象发送过来的自定义消息RE_RECEIVEDBEGIN_MESSAGE_MAP(CMyWcDlg, CDialog)/AFX_MSG_MAP(CMyWcDlg)ON_BN_CLICKED(IDC_SEND, OnSend) ON_MESSAGE(RE_RECEIVED,OnReceive);/AFX_MSG_MAPEND_MESSAGE_MAP(),返回目录,2018/2/12,处理自定义消息(续一),3在CMyWcDlg类添加自定义函数OnMyReceiveclass CMyWcDlg : public CDialogpublic:CMyWcDlg(CWnd* pParent = NULL);CWCSock sockClient; /自定义函数说明LRESULT OnMyReceive(WPARAM wparam,LPARAM lParam);,返回目录,2018/2/12,处理自定义消息(续二),4. 在CMyWcDlg类的实现文件中添加函数体LRESULT CMyWcDlg:OnMyReceive(WPARAM wparam,LPARAM lParam) _DATA *dat; dat = new _DATA; memcpy(dat,(_DATA *)wparam,sizeof(_DATA); CString str = dat-m_strName; str += : ; str += dat-m_dbData;m_ctlRecvd.AddString(str);/将信息添加并显示在列表框中UpdateData(false); /显示列表编辑框内容delete dat; return 1;,返回目录,2018/2/12,处理控件的状态,1. 在OnClose()和OnInitDialog()函数中 GetDlgItem(IDC_CONNECT)-EnableWindow(true); GetDlgItem(IDC_SEND)-EnableWindow(false); GetDlgItem(IDC_CLOSE)-EnableWindow(false); GetDlgItem(IDC_SERVER_PORT)-EnableWindow(true); GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(true); GetDlgItem(IDC_SERVER_NAME)-EnableWindow(true);,返回目录,2018/2/12,处理控件的状态(续),2. 在OnConnect()函数中 GetDlgItem(IDC_CONNECT)-EnableWindow(false); GetDlgItem(IDC_SEND)-EnableWindow(true); GetDlgItem(IDC_CLOSE)-EnableWindow(true); GetDlgItem(IDC_SERVER_PORT)-EnableWindow(false); GetDlgItem(IDC_CLIENT_NAME)-EnableWindow(false); GetDlgItem(IDC_SERVER_NAME)-EnableWindow(false);,返回目录,2018/2/12,9.5.1 创建工程9.5.2 设计用户界面9.5.3 创建侦听类CLSock9.5.4 增加读/写类CRWSock9.5.8 处理接受客户的信息9.5.9 处理客户的连接请求9.5.10 启动、关闭服务器9.5.11 控件的状态更新,9.5 聊天室服务器端应用程序,返回目录,要点提示:,2018/2/12,创建侦听类CLSock,(1) 选择“Insert”菜单的“New Class”菜单项,弹出New Class对话框(2) 在New Class对话框中,Bass class下拉式列表框中选取CSocket作为CLSocket的基类。如下图所示。(3) 单击“OK”按钮,VC+就为MyWs工程创建了一个新类CLSocket,相应地为工程创建了两个文件LSocket.h和LSocket.cpp,返回目录,2018/2/12,增加一个读写类CRWSock,创建CSocket类的派生类CRWSock,与侦听类CLSock位于相同的LSock.h,LSock.cpp文件中。 选择“Insert”菜单的“New Class”菜单项,弹出New Class对话框 在New Class对话框中,Bass class下拉式列表框中选取CSocket作为CRWSock的基类 单击“Change”按钮,弹出“Change Files”对话框。将Header file编辑框修改为LSock.h,Implementation file编辑框框修改为LSock.cpp,如图所示。,返回目录,2018/2/12,处理接受客户的信息,1在CRWSock类中,添加虚拟函数OnReceive() 2. 在虚拟函数OnReceive()中接收客户传来的数据,首先添加到列表编辑框并显示,然后再分两种情况处理: 当收到客户离线信息时,就从套接口链表中删除该结点; 否则,将收到的信息发送给在线的客户。void CRWSock:OnReceive(int nErrorCode) m_p-ReadMessage(this);CSocket:OnReceive(nErrorCode);,返回目录,转下页,2018/2/12,读取客户的信息(续一),void CMyWsDlg:ReadMessage(CRWSock* sock) int len = sock-Receive( ,返 回,2018/2/12,向在线的客户发送信息(续二),void CMyWsDlg:SendMessage(CRWSock* socket,_DATA *buf) POSITION pos = m_list.GetHeadPosition( ); while ( pos != NULL) CRWSock *client =(CRWSock*)m_list.GetNext(pos);if(client = socket)continue;client-Send(buf,sizeof(m_Dat); ,返 回,2018/2/12,处理客户的连接请求,1在CmyWsDlg类中,添加一个CPtrList类的对象,用于管理各个客户的套接口CPtrList m_list;2在CLSock类中添加虚拟函数OnAccept(),用于处理客户的连接请求 void CLSock:OnAccept(int nErrorCode) ASSERT(m_p); m_p-AcceptClient(); CSocket:OnAccept(nErrorCode); 转下页,返回目录,2018/2/12,处理客户的连接请求(续),创建套接口,添加到链表中 void CMyWsDlg:AcceptClient() m_clientSocket = new CRWSock(this);if(!m_listenSocket-Accept(*m_clientSocket) AfxMessageBox(请求连接失败); delete m_clientSocket; m_clientSocket=NULL; return; m_list.AddTail(m_clientSocket); ,返 回,2018/2/12,启动服务器,void CMyWsDlg:OnStart() UpdateData(true); /创建套接口 m_listenSocket = new CLSock(this); if(!m_listenSocket-Create(m_server_port) delete m_listenSocket; m_listenSocket=NULL;return; /进入侦听状态 if(!m_listenSocket-Listen() delete m_listenSocket;m_listenSocket=NULL;return;,返回目录,2018/2/12,关闭服务器,void CMyWsDlg:OnClose() P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论