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]='\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和老王博客http://blog.youkuaiyun.com/wangjiannuaa/article/details/6638423 。后来将Mr王博客里的代码在vs08里测试了下,编译通过,依旧以test.xml为例,不过最初输出不是那么满意:

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


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


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


       菜鸟goes on ~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值