作者:
江南白衣?
??? 雖然現(xiàn)在已是Web Server, Web Service的天下,但偶然還是會(huì)因?yàn)樾阅芸量蹋蛘咝枰远x協(xié)議的原因,很無(wú)辜的要自己做一個(gè)Multi-Thread,Multi-Client的Tcp Server。
???? 第一時(shí)間想起了那兩卷UNP(《Unix Network Programing》),好在現(xiàn)在除了Ice的Java版,Netty2作者的后續(xù)之作Apache MINA,Crmky的Cindy之外,還有個(gè)超簡(jiǎn)單的QuickServer,讓你專心編寫自己的業(yè)務(wù)代碼,不用編寫一行Tcp代碼。
???? 本來(lái)還想花點(diǎn)時(shí)間在幾種框架之間好好選型的,但就在一個(gè)無(wú)聊會(huì)議的間隙里,嘗試著用QuickServer編寫一點(diǎn)代碼,結(jié)果才十幾行代碼就把任務(wù)完成了,還選什么型呢?因此,也把QuickServer作為這個(gè)Pragmatic系列的開(kāi)端。
????? 一開(kāi)始吸引我的是QuickServer的Quick?Start,編寫hanlder類和xml配置文件后,用java? -jar QuickServer.jar -load EchoServer.xml??啟動(dòng)就可以了。
????
XML配置文件:
<quickserver>
????<name>EchoServer?v?1.2</name>
????<port>4123</port>
????<bind-address>0.0.0.0</bind-address>
????<!--?business?logic?classes?-->
????<client-command-handler>
????????org.springside.EchoCommandHandler
????</client-command-handler>
</quickserver>
唯一需要的Hanlder類:
public?class?EchoCommandHandler?implements?ClientCommandHandler?{
????public?void?handleCommand(ClientHandler?handler,?String?command)?throws?SocketTimeoutException,?IOException?{
????????if(command.toLowerCase().equals("quit"))?{
????????????handler.sendClientMsg("Bye?;-)");
????????????handler.closeConnection();
????????}?else?{
????????????handler.sendClientMsg("Echo?:?"+command);
????????}
????}
?}
??? 代碼里只有handleCommand(ClientHandler?handler,?String?command)這個(gè)回調(diào)函數(shù)是必須的方法,參數(shù)String command 是從客戶端傳來(lái)的字串,你可以定義自己的指令協(xié)議,也有byte[]和Java Object的形式。參數(shù)clientHandler 可以對(duì)client作任何事情,比如sendClientMsg()發(fā)送String形式的回應(yīng),當(dāng)然還可以發(fā)送byte[]和Java Object。
??? handleCommand() 將框架的理念發(fā)揮到極致,你完全不需要關(guān)心Tcp編程的底層,不需要API式的線性編程,只要實(shí)現(xiàn)并配置回調(diào)函數(shù),用框架傳來(lái)的command與handler干活就可以了,框架會(huì)完成前后一切的控制工作。
??? 但這個(gè)例子太沒(méi)營(yíng)養(yǎng)了?在我的任務(wù)里,有Query:keyword, Detail:i 和 Bye三種指令,靜態(tài)初始化Spring的ClasspathXmlApplicationContext,通過(guò)getBean("searchService")拿到搜索服務(wù)對(duì)象進(jìn)行搜索,最后學(xué)WebService,用jdom簡(jiǎn)單的將搜索結(jié)果序列化成xml傳給Delphi客戶端解讀。
??? 另一個(gè)接口是EventHandler,可以對(duì)Client的gotConnected,closingConnection 等事件響應(yīng)。
????最后QuickServer提供了ChatServer、FTPServer等example;安全方面支持驗(yàn)證模式;性能方面Charlse說(shuō)單機(jī)上兩萬(wàn)人沒(méi)問(wèn)題....
??? 就這么多了,畢竟一個(gè)短會(huì)間隙就完成的東西,能有多復(fù)雜呢?Pragmatic就是這樣一個(gè)系列,介紹一些輕便的框架,大幅簡(jiǎn)化大家的編程,專心編寫自己的業(yè)務(wù)代碼,不需要知道太多的底層細(xì)節(jié),也沒(méi)有xml配置地獄。
posted on 2006-12-04 19:52
OMG 閱讀(317)
評(píng)論(0) 編輯 收藏 所屬分類:
Soket