2003-10-25 12:09
无双
软件开发中经常有一些常用的技术<br />也许以下写的这些在设计模式中已经有了吧 8过偶没有看<br /><br />下面就总结一下自己开发中的经验<br /><br /><br />回调函数 <br />通信包常用技术<br />长连接与短连接,同步操作与异步操作<br />plugin方法
2003-10-25 12:19
无双
回调函数<br /><br />说到回调函数前要先说明一下函数指针<br /><br />函数指针的定义,定义方法是使用(*)声明 同样以后如果看到有(*p)() 这样就可以认为是函数指针了 再看到里面还有(*p)() (*p)((*q)(int x,int y))<br />这样可以知道是返回函数指针 参数中有函数指针的函数了 虽然是那么的BT<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />//rate.c file<br />#include <iostream><br /><br /><br />void f(int s)<br />{<br /> std::cout<<"call f ,param is:"<<s<<std::endl;<br />}<br /><br />int main()<br />{<br /> void (*p)(int);<br /> void (*p1)(void);<br /> bool (*p2)(int);<br /> p = f; &nbsp; &nbsp;//只有参数与返回值都相同时才可以指向<br /> //p1 = f; 这里赋值会失败<br /> //p2 = f; 这里赋值会失败<br /> p(10);<br /> return 0;<br />}<!--c2--></div><!--ec2--><br /><br /><br />回调函数只是一个功能 它就是调用你传入的函数处理某些事情<br />定义一般如下<br />int p(void(*q)(int& a,int <!--emo&B)--><img src='style_emoticons/default/cool.gif' border='0' style='vertical-align:middle' alt='cool.gif' /><!--endemo-->,int param)<br />也就是在参数中传入一个函数指针<br /><br />使用场合与使用原因<br />如果你的函数想提供一个可订制的接口 让使用者实现其它的功能 <br />那么就可以使用函数指针<br /><br />实现过程<br />p函数对param进行了一定处理后 <br />把处理结果传给q函数让q进行定制 <br />q处理完后再把q处理结果返回给p继续处理 <br /><br />以上步骤并非全要 可以省略某些过程 但是 大体上就是p会把处理的中间结果交给q 处理<br />因为必须在中间调用 所以只能使用函数指针来实现这个功能<br /><br />一个例子<br />偶现在要进行一个长时间操作<br />希望在中间每做完一个步骤后界面上显示一下结果<br /><br />但是 我想用一个函数实现 有可能是因为中间要保存的状态很多 或是其它原因<br />所以不想分成多个函数<br /><br />那么<br />定义你的接口如下<br /><br />int p(void(*q)(const struct A& a),int param)<br /><br />每执行完一个操作后把中间参数传给q 处理<br /><br />客户写个q函数 里面对传进来的参数进行处理<br />void q(const struct A& a);<br /><br />这样就实现了程序的自由
2003-10-25 13:34
无双
<span style='color:red'>通信包常用技术<br /></span><br />现在有很多技术可以使用<br />如XML 还有传统的二进制包如tcp包<br /><br />还会有其它 如EDI就是某个行业制定的文本包等更多<br /><br />那么什么时候使用怎样的包呢<br />其实很多传送方式可以看成是两种 一种是文本方式的<br />另一种是二进制方式的<br /><br />下面先介绍一下文本方式传输中常用到的XML技术<br /><br /><br /><span style='color:blue'>XML</span><br />XML是基于文本传送方式,里面可以用来传送文本内容 <br />它的定义与HTML差不多 但是可以自由的定义新的类型<br />(使用xmlns来定义一个新的名称) 所以很容易扩展 <br />现在广泛使用于WEB应用和以WEB应用为基础的电子商务<br />(SOAP是XML的扩展 <br />它定义了传输方法(使用HTTP协议)<br />传送的内容是XML格式的包<br />另外可以带和电子邮件相似的附件 所以可以看成是XML的一个应用)<br /><br />XML现在网络上有很多现成的XML解析库 无论是JAVA(xerces)还是C++(xerces++) <br />它们会把一个XML文件解析成语法树 <br />然后提供方便的接口可以直接取某个参数的信息<br />另外可提供了根据信息生成XML语法树和XML文件的方法<br />所以开发难度上不难 <br /><br />如果想使用XML传送二进制信息 那么应该进行编码 免得二进制中某些特殊值影响XML的解析<br />如/>,< ,\0等<br />常用的是BASE64编码 <br />如果是传送8bit编码串不用 有的XML解析器支持<br />如果是传双字节的话 最好转换成utf-8再说 utf-8所有的字节都是>128 而中文中只是第一个>128 第二个仍然可能是上面的特殊值 如果XML解析器不支持双字节编码的话 那还是转换成UTF8好<br /><br /><br />XML的优点 <br />可以方便的扩展(因为有xmlns可以定义新名称) <br />有现成的库可用 <br />文本形式保存 可以方便的读出值而不用先找专门程序<br /><br />缺点 <br />传送文件过大 如果你想使用XML来传大二进制文件的话 这个问题就会很明显了<br /><br />[COLOR=blue]其它文本编码方式[COLOR]<br />常见的有 <br />EDI <br />电子数据交换 在XML定义前出现 (可能是80年代初吧) 那时计算机处理能力与普及能力都没有现在高 并且网络也没有现在宽 <br />它的出现只是为了节省纸张 实现无纸交换 <br />由于当时的条件限制 记录格式是定死的 以文件为单位保存记录 所以实时性不好<br />在国内用于海关,使用:分开每一个参数,使用'表示一行结束<br />如10::hello:work:test'<br />如果你有EDI文档那么理解起来不会很麻烦 如果没有就算了 我想这个东西以后会被其它的形式淘汰如XML<br /><br />MML <br />人机界面语言 常用于电信 如电信营业厅的营帐接口 国际上也有标准<br />格式<br />:命令:参数1=值1,参数2=值2,...,参数n=值n;(回车符)<br />格式简单 适合通过TELNET方式传送 所以现在还是有一定应用 如果想实现C/S的话 这个还是有很大的研究空间的 <br />相对之下 XML应该更适合使用B/S条件或是与INTERNET相关的开发<br /><br />[COLOR=blue]二进制编码[COLOR]<br />二微制的优缺点与XML刚好相反<br />二进制传送的内容很紧凑 增加的附加字节不多<br />但是不容易扩展 因为每一位都有自己的含义<br />所以 开始时可以设计晚于扩展的包 或是在可能出现扩展的地方保留一些字节<br />然后就是加个版本号说明(这个重要 不然升级后需要服务器与客户端都需要全部升级 没有向下兼容性)<br />还有就是处理速度快 它不需要进行XML语法分析 <br />二进制也是常用于C/S 特别是在一些需要高速处理的场合<br /><br /><br />其它一些技巧<br />由于TCP是流形式的 所以无法知道一个包到什么地方结束 <br />最好的办法是在包首部加上一个长度标志 接收时先接收长度标志 再根据长度来接收指定长度的内容<br /><br />网络序与主机序的不同问题 不同主机的主机序是不同的 这个不同指int short 的保存格式<br />对字节流不影响<br />最好还是使用网络序传送 int short类型值 如果是char ....那么就不用关心了<br /><br />在C中使用struct时会出现填充字节影响包的分析问题<br />计算机为了优化速度 会把每个变量放在某个值的整数倍的起始地址处<br />如4的倍数的起始地址 如果前面的值不足那么会补上填充字节<br />如<br />struct{<br />char a;<br />int b;<br />};<br />使用sizeof看看是多大<br />这时要设置结构的对齐方式是1 字节 在gcc中是使用fpack-struct选项 外加结构部分使用<br />#pragma pack(1)
2003-10-25 13:49
无双
<span style='color:red'>长连接与短连接</span><br /><br />常听到有人说长连接与短连接的 <br />现在把它的概念说出来吧 这种只是一个通俗的说法<br />这个连接是根据连接时间的长短定义的<br />所说的都是TCP 因为只有TCP才有连接<br /><br />短连接就是一次操作完后断开连接<br /><br />长连接就是一次操作完后不断开连接<br /><br />连接一时保留着<br /><br /><br />短连接常见于大客户情况 如WEB服务器<br />如果每个连接都使用长连接 那么每个客户都保留一个socket <br />系统资源耗费很大 <br /><br />长连接则是多用于操作频繁情况<br />每个TCP连接都需要三步握手 这需要时间 如果每个操作都是先连接 再操作的话那么处理速度会降低很多 所以每个操作完后都不断开 下次处理时直接发送数据包就OK了 不用建立TCP连接<br /><br />另外还有同步操作和异步操作<br />同步操作指上一个操作返回结果后才能发下一个操作的数据包<br />异步操作指先把所有的操作数据包发完后 再等待它们的返回结果<br />相比较看 异步操作速度快 特别是在每个包处理方法独立的情况下 <br /><br />上面只是一个参考 最后要使用哪种类型还是决定于你<br />如联通的短信协议就是 连接后可以发送多个短信包 但如果一段时间(如60s)没有操作 那么连接就会被关闭<br /><br />所以不要固定自己的思维先
2003-10-27 09:19
无双
plugin技术<br /><br />有时你不知道以后会添加什么功能 并且你希望能方便的有第三方提供功能<br />或是希望你的框架能成为一个标准 你eclipse一样 其它的人在你上面可以自己添加自己想做的事 <br />而且不必把他们的代码提交到你这里<br />或是你自己也不希望每添加一个功能就修改一次代码 <br /><br />这时有一个技术可以满足你的要求:plugin<br /><br />plugin(插件)实质上是动态库 应用程序运行时或是启动时会把它读入 然后调用约定好的接口 <br />可以认为plugin是回调函数的增强版(回调需要修改代码 plugin可以随时添加不用修改)<br />也可以看成是与内核中模块差不多的东东 内核中每个模块都有init_module release_module 然后对文件系统 都会定义了所有的函数(open close ioctl fseek 无论有没有实现都需要定义)<br /><br />一个plugin会提供几个函数 <br />一个注册函数 提供插件基本信息 如flash插件就告诉游览器处理MIME中的flash类型<br />应用程序读入插件时会先调用它读入插件信息 同时插件可以在里面旱灾行必要的初始化<br />这一步在load dll时调用<br /><br />接口函数 这个由应用程序规定 一个plugin必须实现所有的接口 接口是实现具体功能 如文件系统中 每个类型的文件都必须实现 read write ioctl fseek 等功能 如果某个文件没有这个操作也会定义成返回一个错误码 而不能不实现<br /><br />Unload函数 取消插件 插件在这里释放自己资源<br />这一步在unload dll时调用 <br /><br />plugin只有注册后才可以使用里面的函数 unload后就不可以调用
2003-10-27 10:02
threehair
长连接、短连接的概念应该配合同步、异步一起吧<br />我看到的一般异步短连接的情况比较多。
2003-10-27 10:18
无双
短连接不是一次操作完就完了吗<br /><br />每次提交完并接收到响应后断开
2003-10-27 10:23
threehair
嗯。但是长连接一直保存着连接,很耗系统资源。<br />一般客户端多点,服务器单点<br />服务器有一进程守护着<br />客户端一发信息,服务器收到,并作处理<br />如果一直保持连接服务器会受不了的
2003-10-27 10:24
threehair
而且客户端的连接只是偶尔。不会一直有业务。所以也没有必要一直保持连接
2003-10-27 10:45
无双
如果连接频繁的话<br />还是会使用长连接的<br /><br />如营帐系统<br /><br />他们的客户端就没有多少<br /><br />而且会是单一的服务器处理<br /><br />所以对他们来说<br />这点资源不重要<br /><br />如果是WEB或是其它B/S结构 或是连接数很多 或是操作不频繁<br />那当然是使用短连接了
2003-10-28 11:43
li2002
谢谢无双JJ
2003-10-28 12:48
threehair
无双,你把自己的贴子编辑一下,禁用表情符号吧。 <!--emo&:awkard:--><img src='style_emoticons/default/awkard.gif' border='0' style='vertical-align:middle' alt='awkard.gif' /><!--endemo-->
2003-10-28 20:04
流氓无产者
不错,很实际
2003-11-6 21:25
odin_free
这个帖子很不错~~~~加精!!! <!--emo&:haha:--><img src='style_emoticons/default/haha.gif' border='0' style='vertical-align:middle' alt='haha.gif' /><!--endemo--> <!--emo&:haha:--><img src='style_emoticons/default/haha.gif' border='0' style='vertical-align:middle' alt='haha.gif' /><!--endemo-->
2003-11-6 21:28
无双
应该还有很多经验的<br />不过不知道什么写<br /><br />下一次写一下设计模式的读书笔记吧
2003-11-6 21:35
odin_free
今天见了一个系统<br /><br />使用tcp建立稳定连接 然后用udp传数据<br /><br />没搞东 说是为了速度
2004-4-12 22:07
ghost6009
有没有关于MML的书籍资料呀?我想看看。。。。我得邮箱是fu_jw@yahoo.com<br />谢谢了QQ119275498<br />MSN:fu_juwen@hotmail.com
2004-5-17 11:03
weiliam
期待你的设计模式
2004-5-19 11:20
qinxj
<!--QuoteBegin-odin_free+2003-11-06 21:35:49--><div class='quotetop'>QUOTE(odin_free @ 2003-11-06 21:35:49)</div><div class='quotemain'><!--QuoteEBegin--> 今天见了一个系统<br /><br />使用tcp建立稳定连接 然后用udp传数据<br /><br />没搞东 说是为了速度 <!--QuoteEnd--></div><!--QuoteEEnd--><br />用tcp进行关键的控制流的传递,而采用udp因为可以进行组播和广播,所以能够提高效率!
2004-6-24 08:49
hyzable
qq好像就是这样
2004-6-24 20:17
无双
udp不需要重传(重传在传输层进行 不需要用户干预)<br /><br />另外tcp需要进行握手 与流窗口协议 另外在底层还会进行包重组织(看我setsockopt中的禁止包重组选项)<br /><br />所以效率是比较低 但是可靠
页:
[1]
Powered by Discuz! Archiver 5.5.0
© 2001-2006 Comsenz Inc.