1、因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。2.2 MFC类CAsyncsocket和CSocket构造一个 CAsyncSocket 对象并使用该对象创建基础 SOCKET 句柄。套接字的创建遵循两阶段构造的 MFC 模式。例如:CAsyncSocket sock;sock.Create( ); / Use the default parameters 对于服务器套接字,必须指定端口。对于客户端套接字,通常接受此参数的默认值,该值允许 Windows Sockets 选择端口。套接字类型: SOCK_STREAM (默认值)或 SOCK_D
2、GRAM 。套接字“地址”,如“”或“128.56.22.8”。该地址为网络上的网际协议 (IP) 地址。很可能要始终依赖此参数的默认值。如果套接字是客户端,则使用 CAsyncSocket:Connect 将此套接字对象连接到服务器套接字。销毁 CAsyncSocket 对象。如果在堆栈上创建了套接字对象,当包含函数超出范围时将调用此对象的析构函数。如果使用 new 运算符在堆上创建了套接字对象,则必须负责使用 delete 运算符销毁此对象。 “阻塞”方案。发送和接收计算机之间的字节顺序差异。在 Unicode 和多字节字符集 (MBCS) 字符串之间转换。2.3 利用CSocket进行有
3、连接的通信CAsyncSocket类逐个封装了WinSock API,为高级网络程序员 提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。为了提供更方便的接口以自动处理这些任务,MFC给出 了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocke
4、t对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept()直到操作完成后才返回控制权。3.1客户端的实现 (1)首先启动Visual C+ 6.0,利用MFC AppWizardEXE建立一个新的MFC工程,工程名为tcpclient,在MFC AppWizard Step1的时候选择Dialog based 即基于对话框,在Step4时勾选Windows Sockets选项(如图3.11),其他默认值下一步。图3.11 MFC的设置 (2)客户端主要分为三个窗口,第一个是连接
5、窗口,需要输入连接到服务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示登录服务器以来发送和接收到的消息;第三个是消息编辑发送窗口,需要输入你要发送的信息内容并发送。 (单击连接服务器按钮时的处理网络连接的函数。代码设置如下:void CTcpclientDlg:Onconnet() / TODO: Add your control notification handler code here if(clconect) clconect.Close(); CString ipstr,portstr; int port; GetDlgItemText(IDC_EDIT1,ipstr); G
6、etDlgItemText(IDC_EDIT2,portstr); GetDlgItemText(IDC_EDIT5,clientname); portstr.TrimLeft(); portstr.TrimRight(); port=atoi(portstr); if(port0&portEnableWindow(false); cw=GetDlgItem(IDC_EDIT2); cw=GetDlgItem(IDC_connet); cw=GetDlgItem(IDC_EDIT5); SetDlgItemText(IDC_EDIT3,已设名字+clientname+rn连接服务器成功); C
7、String enterinfo=clientname+进入聊天室; int len=enterinfo.GetLength(); clconect.Send(enterinfo,len); else clconect.Close(); MessageBox(连接失败,请检查IP与端口是否与服务器一致!或者服务器没打开,连接错误,MB_ICONERROR); else MessageBox(端口或IP输入有误,请重新输入设计步骤:创建字符串ipstr(保存IP),portstr(保存端口),clientname(用户名),整型port(端口号)。利用GetDlgItemText将各个编辑框中的
8、信息赋给相应的变量。监视端口号和IP格式并设置相应错误提示(如下图)。 图3.13 连接错误提示图3.14 端口或IP错误提示创建套接字clconect,设置成功创建后相关控件为只读。设置建立连接后相应提示。(5)接下来就是对话框中的发送(回车)按钮的函数,代码设置如下:Onsend() CString str; GetDlgItemText(IDC_EDIT4,str); str=clientname+str; int len=str.GetLength(); if(clconect.Send(str,len)1)SetDlgItemText(IDC_EDIT4, 定义字符串str用于保存输
9、入的消息,调整格式后使用CSocket的操作函数send将消息发送到服务器。(6)要显示客户端接收到来自服务器其他用户的信息,代码设置如下:onrev() CString str,str1; char ss256; for(int j=0;jLineScroll(ce-GetLineCount()-1);创建字符串str、str1,字符数组ss。接受来自服务器套接字的信息数据保存到ss中,调整格式后将其打印到消息区。(7)当与服务器断开连接时弹出警告,如下图: 图3.15 失去连接提示oncl() MessageBox(失去连接或者找不到服务器 CWnd *cw=GetDlgItem(IDC_
10、EDIT1); cw-EnableWindow(true); cw=GetDlgItem(IDC_EDIT2); cw=GetDlgItem(IDC_connet); cw=GetDlgItem(IDC_EDIT5);当失去与服务器的连接后,重新将连接服务器设置编辑框启用等待下次连接。(8)在退出程序时的提示,如下图:图3.16 退出确认OnClose() int confirm=MessageBox(确定退出吗请确定,MB_YESNO|MB_ICONQUESTION); if(confirm=IDYES) CString enterinfo=clientname+退出了聊天室 int len
11、=enterinfo.GetLength(); clconect.Send(enterinfo,len); CDialog:OnClose();当退出程序时,弹出确认对话框。当选择“是”时,将用户退出信息发送至服务器并关闭对话框。至此客户端的核心部分介绍完毕。3.2服务端的实现(1)和客户端一样,仍然建立一个基于对话框的工程,工程名为tcpserver,同样,注意一定不要忘记在Step4时勾选Windows Sockets选项。其他默认下一步。(2)客户端主要分为三个窗口,第一个是服务器信息设置窗口,需要输入服务器的相关设置信息;第二个是聊天信息显示窗口,该窗口显示启动服务器以来发送和接收到的
12、消息;新建一个对话框,并添加各种控件(见控件表3.2)如下图:单击启动服务器按钮时的处理网络连接的函数。void CTcpseverDlg:Onlisten() / Beep(2000,100);int port; GetDlgItemText(IDC_EDIT3,ipstr); severname=ipstr; GetDlgItemText(IDC_EDIT4,portstr); if(cslisten.Create(port) / cslisten.Bind(port); cslisten.Listen(); cslisten.setp(this,csnum); CWnd *cw=GetD
13、lgItem(IDC_EDIT3); cw=GetDlgItem(IDC_EDIT4); cw=GetDlgItem(IDC_listen); cw=GetDlgItem(IDC_EDIT1);SetWindowText(服务器名:+severname+rn等待用户连接,监听端口:+portstr+.设置监听端口失败,端口可能被其它程序占用 cslisten.Close();端口输入有误,请重新输入 创建字符串ipstr(保存IP),portstr(保存端口),整型port(端口号)。监视端口号和IP格式并设置相应错误提示设置建立连接后相应提示。 CString str,history; Ge
14、tDlgItemText(IDC_EDIT1,history); GetDlgItemText(IDC_EDIT2,str); str=severname+ int sended; for(int i=1;i定义字符串str用于保存输入的消息,调整格式后使用CSocket的操作函数send将消息发送到各个客户端。(6)要显示服务器接收到来自客户端其他用户的信息,代码设置如下:onrev(int mynum)int i; char ss100;100; csrevmynum.Receive(ss,100); str.Format( for(i=1;i+)if(csrevi) if(csrevi)
15、 csrevi.Send(str,100); GetDlgItemText(IDC_EDIT1,str1); str=str1+ SetDlgItemText(IDC_EDIT1,str); CEdit *ce=(CEdit*)GetDlgItem(IDC_EDIT1); ce-(7)当有新用户进入时,显示“XXX进入”。代码如下:onac() CString str1,str; GetDlgItemText(IDC_EDIT1,str1); CString str2=rn进入 str=str1+str2; SetDlgItemText(IDC_EDIT1,str); cslisten.Acc
16、ept(csrev+csnum); csrevcsnum.setp(this,csnum);图3.24 退出确认 CString str=服务器即将退出 int confirm=MessageBox(确定退出服务器?所有用户都将断开 int len=str.GetLength(); for(int i=1;i+) if(csrevi) csrevi.Send(str,len); str=severname+退出,与服务器连接已断开 len=str.GetLength(); for( i=1;当选择“是”时,将服务器关闭信息发送至各个客户端并关闭对话框。.程序运行结果4.1 服务器端 图 4.4.2 客户端图 4.2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1