flex客户端+vc服务端,实现配置文件修改
?? ? ?配置文件采用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]=' '; //填充结束的,不然会是乱码 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 = "*套接字建立失败!rn"; delete m_kServerSocket; UpdateData(false); return ; } if(!m_kServerSocket->Listen()) //建立监听 { m_str = "*套接字监听失败!rn"; 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和老王博客http://www.voidcn.com/article/p-ejolpady-bhk.html?。后来将Mr王博客里的代码在vs08里测试了下,编译通过,依旧以test.xml为例,不过最初输出不是那么满意: where is my 汉字?想到了修改项目的语言支持。在项目->属性中,修改字符集为多字节,如下: 改为多字节后,结果正确了: ?? ? ?至此,搞定,下面也许是搞定多个连接的问题?也许是搞定自定义协议发送和接收以修改配置文件的问题,毕竟发送的内容不止RGB,再说吧,that is not important ?? ? ? 菜鸟goes on ~~~ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- char const * const * const varName
- Cocos2d-x3.0 iOS 一键编译多个target并打包ipa
- Oracle事务和对象上集(视图、索引)
- xcode – UICollectionView在IB中不包含UICollectionViewCe
- Oracle 常见函数用法
- dojo.io.iframe.send在dojo 1.8中第二次不发送请求
- SP2-0157: unable to CONNECT to ORACLE after 3 attempts,
- c# – XSL问题XSL选择特定的字段名称
- 表现 – LOWER LIKE vs iLIKE
- c# – Mono:适用于Windows的HeapShot GUI在哪里?