这个简单的聊天程序包括如下功能:
1、接收所有发过来的消息 2、给指定ip地址发送消息
用的ACE类包括:ACE_INET_Addr,ACE_SOCK_Stream,ACE_SOCK_Connector,ACE_SOCK_Acceptor。
聊天程序建立步骤如下(VS2003):
1、建立MFC对话框项目,在项目的同级文件夹建立两个文件夹:inc,bin,其中inc中存放ace文件夹,bin文件夹中包括两个文件,ACED.dll,ACED.lib
2、配置项目属性:附加库目录为../bin,附加包含目录为../inc,附加依赖项为ACED.lib,项目输出文件为 ../bin/chat.exe。
3、在对话框上拖入控件如下:三个文本框,分别是聊天记录,IP地址,发送内容。一个发送按钮。
4、关键代码如下:
(1)包含头文件:
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Acceptor.h"
在构造函数里面初始化ACE:ACE::init();
在析构函数里面写:ACE::fint();
(2)接收消息:使用线程实现,该线程在初始化时候启动
线程函数声明:static UINT _stdcall Thread_Recv_Msg(LPVOID lpParam);
初始化启动线程:::AfxBeginThread((AFX_THREADPROC)Thread_Recv_Msg,NULL);
线程实现函数:
CClientDlg *dlg=(CClientDlg*)AfxGetApp()->GetMainWnd(); //主对话框指针
ACE_INET_Addr ace_address;
int iResult = ace_address.set(7777);//指定端口
ACE_SOCK_Acceptor ace_acceptor;
if(ace_acceptor.open(ace_address) == -1)
{
return 0;
}
ACE_SOCK_Stream ace_stream;
while (true)
{
if(ace_acceptor.accept(ace_stream) == -1)
{
return 0;
}
const int SIZE = 1024;
char str[SIZE];
size_t s = ace_stream.recv(str,SIZE);
char* pStr = new char[s];
for(size_t i=0;i<s;i++)
pStr[i] = str[i];
CString strInfo;
strInfo.Format("收到消息:%s",pStr);
dlg->InsertRecord(strInfo);//将消息内容显示到聊天记录文本框
delete []pStr;
}
return 1;
(3)发送消息:发送按钮的事件响应
CString strIP;
GetDlgItemText(IDC_EDIT_IP,strIP);
ACE_INET_Addr addr(7777,strIP.GetBuffer());
ACE_SOCK_Stream stream;
ACE_SOCK_Connector con;
int iResult = con.connect(stream,addr);//主动连接
if(iResult != -1)
{
CString strContent;
GetDlgItemText(IDC_EDIT_CONTENT,strContent);
stream.send(strContent.GetBuffer(),strContent.GetLength());
CString strInfo;
strInfo.Format("发送消息:%s",strContent);
InsertRecord(strInfo);//将发送的消息内容也显示到聊天记录文本框
}
(4)InsertRecord的实现:
CString strOldContent;
GetDlgItemText(IDC_EDIT_RECORD,strOldContent);
CString strNewContent;
strNewContent.Format("%s%c%c%s",strOldContent,13,10,strRecord);
SetDlgItemText(IDC_EDIT_RECORD,strNewContent);
测试:运行bin目录下的chat.exe程序,ip地址输入127.0.0.1,点击发送按钮