【VC++开源代码栏目提醒】:网学会员为需要VC++开源代码的朋友们搜集整理了WinCE数据通讯之Web Service篇 - 其它资料相关资料,希望对各位网友有所帮助!
准备写个 WinCE 平台与数据库服务器数据通讯交互方面的专题文章,今天先整理个Web Service 通讯方式。
公司目前的硬件产品平台是 WinCE5.0,数据通讯是连接服务器与终端的桥梁,关系着终端的数据能否准确及时高效抵达服务器,是整个项目成败的关键。
原先公司有同事用
VC 写过一个程序用 Socket 进行数据通讯,但一直问题不断。
年前我开始探索用 SqlCE 与SqlServer 数据同步方式进行数据上传与下载,通讯已经正常稳定。
这方面的文章后续再整理。
Web Service 用于 PC 间通讯的文章网上有很多,但用于 WinCE 平台调用的经验总结并不多见。
Web Service 的程序编写与配置调用相对来讲比较简单,Visual Studio 里直接新建一个“ASP.net web 服务应用程序”就可以创建一个 web Service 项目了。
其中的
代码根据实际需求编写就行,这方面就不详述了。
终端设备是通过 GPRS 来进行数据传输的,因此,数据流量是非常重要的问题,应当尽可能少的减少数据传输,流量可是 Money,压缩技术是关键。
Google 大法,找到了一款物美价廉的东东-Ihttp://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx 所谓物美是这款
代码支持 Dot net CF 平台,所谓价廉是这款
代码完全
开源免费。
操刀开工。
。
先建一个直接返回 DataSet 集的 Web Service 服务 。
private SqlConnection Conn private string ConnString quotData SourcelocalInitialCatalogNorthwinduidsapwdsaquotdataConnectionregion dataConnection private DataSet GetNorthwindDataSet return ExecuteSqlquotselect from Employeesquot private DataSet ExecuteSqlstring MySQL DataSet dataSet new DataSet SqlDataAdapter adapter new SqlDataAdaptermysql this.Conn try if this.Conn.State ConnectionState.Closed this.Conn.Open adapter.FilldataSet quottablequot catch Exception exception HttpContext.Current.Response.Writeexception.Message HttpContext.Current.Response.End finally if this.Conn null ampamp this.Conn.State ConnectionState.Open this.Conn.Close adapter.Dispose return dataSet endregion //方法一:直接返回 DataSet 对象 WebMethodDescription quot直接返回 DataSet 对象。
quot public DataSet GetDataSet DataSet dataSet GetNorthwindDataSet return dataSet 建立一个智能设备应用程序,添加 Web 引用,我这里用的是静态引用,没有用动态引用的原因是,试过网上的动态生成 WebService 引用的
代码,效率远比静态引用要低很多,考虑终端设备资源的有限性,还是用的静态引用。
建立好项目后在界面上添加一个button 和 DataGrid 控件,添加
代码: Code private webSer.Service1 ws private void FrmMain_Loadobject sender EventArgs e ws new DeviceApplication1.webSer.Service1 //webmethod 直接返回 dataset private void btnDataSet_Clickobject sender EventArgs e try this.dtGrid.DataSource null DateTime dtBegin DateTime.Now DataSet ds ws.GetDataSet DateTime dtDown DateTime.Now this.dtGrid.DataSource ds.Tables0 MessageBox.Showstring.Formatquot下载耗时:0,绑定数据耗时:1,数据量:2quot dtDown - dtBegin DateTime.Now - dtDownds.GetXML.Length catch Exception ex MessageBox.Showex.ToString 连接好终端设备,测试点击按钮,几秒后 DataGrid 表格正确显示数据,OK,说明WinCE 已经能够正确调用 Web Service 了。
如果不能正确调用,检察 WebService 发布与 Web 引用是否正确,数据库配置是否正确。
接下来就是要把数据进行压缩了,压缩前要进行数据的序列化,序列化
代码如下: ///// ltsummarygt /// 序列化数据成 byte /// lt/summarygt /// ltparam namequotoquotgt未序列化的数据lt/paramgt /// ltreturnsgt返回序列化后的 byte数组lt/returnsgt public static byte byteXMLSerializerobject o if o null throw new ArgumentNullExceptionquotnull inputquot try System.XML.Serialization.XmlSerializer ser newSystem.Xml.Serialization.XmlSerializero.GetType System.IO.MemoryStream mem new MemoryStream System.Xml.XmlTextWriter writer newSystem.Xml.XmlTextWritermem Encoding.Default ser.Serializewriter o writer.Close return mem.ToArray catch Exception ex throw ex ///// ltsummarygt /// 反序列化数据 /// lt/summarygt /// ltparam namequotinputquotgt序列化后的数据lt/paramgt /// ltparam namequottypequotgt被序列化的数据类型lt/paramgt /// ltreturnsgt返回反序列化后的 object 数据lt/returnsgt public static object objXmlDeserializebyte input Type type if input null throw new ArgumentNullExceptionquotnull inputquot try XmlSerializer mySerializer new XmlSerializertype StreamReader stmRead new StreamReadernewMemoryStreaminput System.Text.Encoding.Default return mySerializer.DeserializestmRead catch Exception ex throw ex ICSharpCode 提供了多种数据压缩的方式,我这里测试了四种方式:BZip,Deflate,GZip,Zip private static int buffSize 2048//指定压缩块缓存的大小,一般为2048的倍数 ///// ltsummarygt /// BZIP2压缩数据 /// lt/summarygt /// ltparam namequotinputquotgt原始未压缩数据lt/paramgt /// ltreturnsgt压缩后的 byte数据lt/returnsgt public static byte BZipCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try //int buffSize 2048//指定压缩块的大小,一般为2048的倍数 using MemoryStream outmsStrm new MemoryStream using MemoryStream inmsStrm newMemoryStreaminput BZip2.CompressinmsStrm outmsStrmbuffSize return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt /// 解压缩 BZIP2数据 /// lt/summarygt /// ltparam namequotinputquotgt被 BZIP2压缩过的 byte数据lt/paramgt /// ltreturnsgt解压后的 byte数据lt/returnsgt public static byte BZipDeCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try using MemoryStream outmsStrm new MemoryStream using MemoryStream inmsStrm newMemoryStreaminput BZip2.DecompressinmsStrm outmsStrm return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt /// 压缩 Deflater 数据 /// lt/summarygt /// ltparam namequotinputquotgt待压缩 byte数据lt/paramgt /// ltreturnsgt返回压缩后的 bytelt/returnsgt public static byte DeflaterCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try Deflater mDeflater newDeflaterDeflater.BEST_COMPRESSION //int buffSize 2048//131072 buff size using MemoryStream outmsStrm new MemoryStream using DeflaterOutputStream mStream newDeflaterOutputStreamoutmsStrm mDeflater buffSize mStream.Writeinput 0 input.Length return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt /// 解压缩 Deflater 数据 /// lt/summarygt /// ltparam namequotinputquotgt压缩过的 byte数据lt/paramgt /// ltreturnsgt解压后的 byte数据lt/returnsgt public static byte DeflaterDeCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try Int32 mSize //int buffSize 2048 byte buff new bytebuffSize using MemoryStream outmsStrm new MemoryStream using InflaterInputStream mStream newInflaterInputStreamnew MemoryStreaminput while true mSize mStream.Readbuff 0buff.Length if mSize gt 0 outmsStrm.Writebuff 0mSize else break return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt/// GZIP 压缩/// lt/summarygt/// ltparam namequotinputquotgt未压缩的数据lt/paramgt/// ltreturnsgtGZIP 压缩后的数据lt/returnsgtpublic static byte GZipCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try using MemoryStream outmsStrm new MemoryStream using GZipOutputStream gzip newGZipOutputStreamoutmsStrm gzip.Writeinput 0 input.Length return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt /// GZIP 解压缩 /// lt/summarygt /// ltparam namequotinputquotgt压缩过的数据lt/paramgt /// ltreturnsgt解压后的数据lt/returnsgt public static byte GZipDeCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try using MemoryStream outmsStrm new MemoryStream using GZipInputStream gzip newGZipInputStreamnew MemoryStreaminput Int32 mSize //int buffSize 2048 byte buff new bytebuffSize while true mSize gzip.Readbuff 0 buffSize if mSize gt 0 outmsStrm.Writebuff 0mSize else break return outmsStrm.ToArray catch Exception ex throw ex ///// ltsummarygt/// ZIP 压缩数据/// lt/summarygt/// ltparam namequotinputquotgt待压缩的数据lt/paramgt/// ltreturnsgtZIP 压缩后的数据lt/returnsgtpublic static byte ZipCompressbyte input if input null throw new ArgumentNullExceptionquotnull inputquot try using MemoryStream outmsStrm new MemoryStream using ZipOutputStream zipStrm newZipOutputStreamoutmsStrm ZipEnt.
上一篇:
C++学习之道 pdf
下一篇:
淮河中下游水环境中PAHs的分布及其降解菌的筛选