您的位置:首页 > 其它

flex客户端+vc服务端,实现配置文件修改

2011-07-27 22:04 696 查看
配置文件采用XML实现,简略xml文件test.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<Config>
<typeid>001</typeid>
<typename>调色板</typename>
<rgb>cc33ff</rgb>
</Config>
由于flex不具有写文件的API,所以,将调色后的RGB以socket发送到服务器端,由服务端对文件进行修改,以使下次登录读取配置文件时,有保存的RGB值。flex客户端,发送RGB代码如下:

protected function ChangeHandler():void{
var brite:uint=slider.value;
var adjustedColor:uint = ColorUtil.adjustBrightness(colorPicker.selectedColor, brite);
box.setStyle("backgroundColor",adjustedColor);
socket.writeUTFBytes(colorPicker.selectedColor.toString(16)+'\n');//得用string发送
socket.flush();//发送当前RGB值以测试,拖动条时会发送过多
trace(colorPicker.selectedColor.toString());
}

这里,采用socket.writeUnsignedInt服务端则会收不到,另外发送加上'\n',是为了使服务端收到时进行一个结束的判断,由于不加,则发送RGB,收到RGB值时,末尾为问号??只是toString()发送,则收到为650074这种数字,不过数字位数不一定,也可能为250等3位数。
下面是服务端的的编写:
首先,新建基于对话框MFC的exe工程,这里命名为vcserver,注意勾选添加winsock支持:



其中,只有编辑框绑定CString类型m_str,用于显示收到RGB值,以检测收到的是否正确,其他按钮增加响应函数,不过这里写入文件的按钮并没有使用。
然后插入两个socket,CServerSocket,用于服务端监听,CClientSocket,用于接收客户端消息。
说到这里,顺便扯一句,以前写的socket编程什么的,都给忘了,去网上搜了很多,一个用windows SDK编写的倒是不错,不过SDK编程,确实不会啊,另外两个用CSocket写的还好,就借鉴了。
由于显示消息需要在主要Dlg当中,所以,socket的接收可以放到主Dlg文件的cpp中。于是另外2个socket的构造函数也就添加dlg类。这里vcserverDlg.h中需要包含另外2个socket的头文件,而另外2个socket也需要用到vcserverDlg成员,所以,在vcserverDlg.h中
#include "ServerSocket.h"
#include "lientSocket.h"
在2个socket的头文件中,声明vcserverDlg类成员:

class CVcserverDlg;
并增加成员
CVcserverDlg *m_pDlg;

socket的构造函数如下:(以CClientSocket为例,CServerSocket同样)需要注意的是,这里虽然命名为server,不过担任的是Listen的功能。
CClientSocket::CClientSocket(CVcserverDlg *pDlg)
{
m_pDlg = pDlg;
}
监听socket的OnAccept()函数需要重写,同样的,重写函数在vcserverDlg中
void CServerSocket::OnAccept(int nErrorCode)
{
CSocket::OnAccept(nErrorCode);
m_pDlg->OnAccept();
}
接收socket的OnReceive()也需要重写

void CClientSocket::OnReceive(int nErrorCode)
{
CSocket::OnReceive(nErrorCode);
m_pDlg->OnReceive(this);
}
注意这里的this参数,则在CvcserverDlg中的OnReceive需要有CClientSocket参数:另外,需要添加2个socket指针成员,和上面显示的重写的OnAccept(),如下:

CServerSocket *m_kServerSocket;
CClientSocket *m_csock;
OnReceive(CClientSocket *);
OnAccept();
实现如下:
CVcserverDlg::OnAccept()
{
m_kServerSocket->Accept(*m_csock);//接收
MessageBox("one come ...");
}
CVcserverDlg::OnReceive(CClientSocket *ps)
{
char m_buf[1024];
ps->Receive(m_buf,1024);
int count=0;
for (count = 0 ; count <1024 ; count++)
{
if (m_buf[count]=='\n')
break;
}
m_buf[count]='\0'; //填充结束的,不然会是乱码

CString temp;
temp.Format("%s",m_buf);
strcpy(m_buf,temp.GetBuffer(temp.GetLength()));
temp.ReleaseBuffer();
m_str = temp; //让m_str始终为当前RGB的CString表示
UpdateData(FALSE);
}
void CVcserverDlg::OnOK()
{
m_kServerSocket = new CServerSocket(this);
if(!m_kServerSocket->Create(8001)) //建立监听套接字
{
m_str = "*套接字建立失败!\r\n";
delete m_kServerSocket;
UpdateData(false);
return ;
}
if(!m_kServerSocket->Listen()) //建立监听
{
m_str = "*套接字监听失败!\r\n";
delete m_kServerSocket;
UpdateData(false);
return ;
}
MessageBox("开始监听咯");
m_str = "server is starting";
UpdateData(FALSE);
m_csock = new CClientSocket(this);
}
void CVcserverDlg::OnStop()
{
m_kServerSocket->Close();
delete m_kServerSocket;
delete m_csock;
m_kServerSocket = NULL;
m_csock = NULL;
MessageBox("服务已关闭");
}
void CVcserverDlg::OnClear()
{
m_str = "";
UpdateData(FALSE);
}

至此,RGB的发送搞定,下面就开始写入配置的xml文件了,MFC居然没有自带的xml操作类,后来经WJ同学推荐CMarkup类,上网搜了很多使用方法,不过将下载的Markup.h和Markup.cpp直接导入工程会编译出错 ,参考http://www.cppblog.com/totti1006/archive/2009/07/27/63672.html,知道在Markup.cpp的最开头加上#include "stdafx.h"。
说到这个,网上很多人都是抄的,还些到博客里,不过抄的很不详细,搞的我新用的就不清楚了,顺便说个,这票人,自己用过吗?不过,从另一个角度来看,博客园果然更可靠,访问貌似确实比csdn高。关于CMarkup类,更多消息可参考:http://www.firstobject.com/dn_markup.htm

下面,在CvcserverDlg.h中添加包含

#include "Markup.h"
后来,考虑保存RGB直接放到退出前,则在退出响应函数中添加xml的写入内容:

void CVcserverDlg::OnCancel()
{//还是退出前写比较实在
CMarkup xml;
BOOL bLoadXml=FALSE;
bLoadXml=xml.Load("test.xml");
if(bLoadXml)
{
CString str=_T("");
xml.ResetMainPos();
xml.FindElem();
xml.IntoElem();
while(xml.FindElem("rgb"))
{
str=xml.GetData();
MessageBox("ri");
xml.SetData(m_str);//SetData
xml.Save("test.xml");//保存配置文件
break;
}
}
CDialog::OnCancel();
}
运行结果就是弹出窗口什么的,以及显示RGB值,就不给出图了,另外退出的时候,目前只是简单的用m_str替代文件中的rgb项目的值,在开始和结束的时候,都有对m_str修改的部分,需要小心,以后再完善。
另外,搞定xml文件,也可以用微软的msxml.dll,个人感觉用法像ado,还com接口什么的,生疼啊。可以参考http://apps.hi.baidu.com/share/detail/23347512和老王博客/article/7640472.html 。后来将Mr王博客里的代码在vs08里测试了下,编译通过,依旧以test.xml为例,不过最初输出不是那么满意:



where is my 汉字?想到了修改项目的语言支持。在项目->属性中,修改字符集为多字节,如下:



改为多字节后,结果正确了:



至此,搞定,下面也许是搞定多个连接的问题?也许是搞定自定义协议发送和接收以修改配置文件的问题,毕竟发送的内容不止RGB,再说吧,that is not important

菜鸟goes on ~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: