??? 雖然現(xiàn)在已是Web Server, Web Service的天下,但偶然還是會(huì)因?yàn)樾阅芸量蹋蛘咝枰远x協(xié)議的原因,很無辜的要自己做一個(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代碼。
???? 本來還想花點(diǎn)時(shí)間在幾種框架之間好好選型的,但就在一個(gè)無聊會(huì)議的間隙里,嘗試著用QuickServer編寫一點(diǎn)代碼,結(jié)果才十幾行代碼就把任務(wù)完成了,還選什么型呢?因此,也把QuickServer作為這個(gè)Pragmatic系列的開端。
????? 一開始吸引我的是QuickServer的Quick?Start,編寫hanlder類和xml配置文件后,用java? -jar QuickServer.jar -load EchoServer.xml??啟動(dòng)就可以了。
????
XML配置文件:
????<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>
唯一需要的Hanlder類:
????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 是從客戶端傳來的字串,你可以定義自己的指令協(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ù),用框架傳來的command與handler干活就可以了,框架會(huì)完成前后一切的控制工作。
??? 但這個(gè)例子太沒營(yíng)養(yǎng)了?在我的任務(wù)里,有Query:keyword, Detail:i 和 Bye三種指令,靜態(tài)初始化Spring的ClasspathXmlApplicationContext,通過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說單機(jī)上兩萬人沒問題....
??? 就這么多了,畢竟一個(gè)短會(huì)間隙就完成的東西,能有多復(fù)雜呢?Pragmatic就是這樣一個(gè)系列,介紹一些輕便的框架,大幅簡(jiǎn)化大家的編程,專心編寫自己的業(yè)務(wù)代碼,不需要知道太多的底層細(xì)節(jié),也沒有xml配置地獄。
以前自己還寫UDP,TcP通訊呢。協(xié)議,線程什么的一大堆代碼,煩死了。
希望Pragmatic系列能出來更多,期待。
That's what I want!
Hence our interpretation of the LGPL is that the use of the unmodified QuickServer source or binary does not affect the license of your application code. If you modify QuickServer and/or redistribute your modifications, the LGPL restrictions apply.
選quickserver主要是因?yàn)楫吘剐枨蟛欢啵鴔uick server良好的框架回調(diào)機(jī)制,可以在對(duì)TCP/IP毫無了解的情況下完成任務(wù),而其他幾個(gè)框架雖然也有很好的封裝,但始終是API式線性編程,需要自己了解一點(diǎn)東西。
開會(huì)不專心。再無聊也不應(yīng)該開小差阿。。
!>>