Netty鍏ラ棬一

Netty鍏ラ棬1

1. 闂

鐜板湪锛屾垜浠娇鐢ㄩ€傚悎涓€鑸敤閫旂殑搴旂敤鎴栫粍浠舵潵鍜屽郊姝ら€氫俊銆備緥濡傦紝鎴戜滑甯稿父浣跨敤涓€涓?/span>HTTP瀹㈡埛绔粠杩滅▼鏈嶅姟鍣ㄨ幏鍙栦俊鎭垨鑰呴€氳繃web services杩涜杩滅▼鏂规硶鐨勮皟鐢ㄣ€?/span>

鐒惰€岋紝涓€涓€傚悎鏅€氱洰鐨勭殑鍗忚鎴栧叾瀹炵幇骞朵笉鍏峰鍏惰妯′笂鐨勬墿灞曟€с€備緥濡傦紝鎴戜滑鏃犳硶浣跨敤涓€涓櫘閫氱殑HTTP鏈嶅姟鍣ㄨ繘琛屽ぇ鍨嬫枃浠讹紝鐢甸偖淇℃伅鐨勪氦浜掞紝鎴栬€?/span>澶勭悊閲戣瀺淇℃伅鍜屽浜烘父鎴忔暟鎹偅绉嶈姹傚噯瀹炴椂娑堟伅浼犻€掔殑搴旂敤鍦烘櫙銆傚洜姝わ紝杩欎簺閮借姹備娇鐢ㄤ竴涓€傜敤浜庣壒娈婄洰鐨勫苟缁忚繃楂樺害浼樺寲鐨勫崗璁疄鐜般€備緥濡傦紝浣犲彲鑳芥兂瑕佸疄鐜?/span>涓€涓鍩轰簬AJAX鐨勮亰澶╁簲鐢紝濯掍綋娴佹垨澶ф枃浠朵紶杈撹繘琛岃繃鐗规畩浼樺寲鐨?/span>HTTP鏈嶅姟鍣ㄣ€備綘鐢氳嚦鍙兘鎯冲幓璁捐鍜屽疄鐜颁竴涓叏鏂扮殑锛岀壒瀹氫簬浣犵殑闇€姹傜殑閫氫俊鍗忚銆?/span>

鍙︿竴绉嶆棤娉曢伩鍏嶇殑鍦烘櫙鏄綘鍙兘涓嶅緱涓嶄娇鐢ㄤ竴绉嶄笓鏈夌殑鍗忚鍜屽師鏈夌郴缁熶氦浜掋€傚湪杩欑鎯呭喌涓嬶紝浣犻渶瑕佽€冭檻鐨勬槸濡備綍鑳藉蹇€熺殑寮€鍙戝嚭杩欎釜鍗忚鐨勫疄鐜板苟涓斿悓鏃惰繕娌℃湁鐗虹壊鏈€缁堝簲鐢ㄧ殑鎬ц兘鍜岀ǔ瀹氭€с€?/span>


2.
鏂规


Netty
鏄竴涓紓姝ョ殑锛屼簨浠堕┍鍔ㄧ殑缃戠粶缂栫▼妗嗘灦鍜屽伐鍏凤紝浣跨敤Netty 鍙互蹇€熷紑鍙戝嚭鍙淮鎶ょ殑锛岄珮鎬ц兘銆侀珮鎵╁睍鑳藉姏鐨勫崗璁湇鍔″強鍏跺鎴风搴旂敤銆?/span>

涔熷氨鏄锛?/span>Netty 鏄竴涓熀浜?/span>NIO鐨勫鎴凤紝鏈嶅姟鍣ㄧ缂栫▼妗嗘灦锛屼娇鐢?/span>Netty 鍙互纭繚浣犲揩閫熷拰绠€鍗曠殑寮€鍙戝嚭涓€涓綉缁滃簲鐢紝渚嬪瀹炵幇浜嗘煇绉嶅崗璁殑瀹㈡埛锛屾湇鍔$搴旂敤銆?/span>Netty鐩稿綋绠€鍖栧拰娴佺嚎鍖栦簡缃戠粶搴旂敤鐨勭紪绋嬪紑鍙戣繃绋嬶紝渚嬪锛?/span>TCP鍜?/span>UDP鐨?/span>socket鏈嶅姟寮€鍙戙€?/span>

鈥?/span>蹇€?/span>鈥?/span>鍜?/span>鈥?/span>绠€鍗?/span>鈥?/span>骞朵笉鎰忓懗鐫€浼氳浣犵殑鏈€缁堝簲鐢ㄤ骇鐢熺淮鎶ゆ€ф垨鎬ц兘涓婄殑闂銆?/span>Netty 鏄竴涓惛鏀朵簡澶氱鍗忚鐨勫疄鐜扮粡楠岋紝杩欎簺鍗忚鍖呮嫭FTP,SMPT,HTTP锛屽悇绉嶄簩杩涘埗锛屾枃鏈崗璁紝骞剁粡杩囩浉褰撶簿蹇冭璁$殑椤圭洰锛屾渶缁堬紝Netty 鎴愬姛鐨勬壘鍒颁簡涓€绉嶆柟寮忥紝鍦ㄤ繚璇佹槗浜庡紑鍙戠殑鍚屾椂杩樹繚璇佷簡鍏跺簲鐢ㄧ殑鎬ц兘锛岀ǔ瀹氭€у拰浼哥缉鎬с€?/span>

涓€浜涚敤鎴峰彲鑳芥壘鍒颁簡鏌愪簺鍚屾牱澹扮О鍏锋湁杩欎簺鐗规€х殑缂栫▼妗嗘灦锛屽洜姝や綘浠彲鑳芥兂闂?/span>Netty 鍙堟湁浠€涔堜笉涓€鏍风殑鍦版柟銆傝繖涓棶棰樼殑绛旀鏄?/span>Netty 椤圭洰鐨勮璁″摬瀛︺€備粠鍒涚珛涔嬪垵锛屾棤璁烘槸鍦?/span>API杩樻槸鍦ㄥ叾瀹炵幇涓?/span>Netty 閮借嚧鍔涗簬涓轰綘鎻愪緵鏈€涓鸿垝閫傜殑浣跨敤浣撻獙銆傝櫧鐒惰繖骞朵笉鏄樉鑰屾槗瑙佺殑锛屼絾浣犵粓灏嗕細璁よ瘑鍒拌繖绉嶈璁″摬瀛﹀皢浠や綘鍦ㄩ槄璇绘湰鎸囧崡鍜屼娇鐢?/span>Netty 鏃跺彉寰楁洿鍔犲緱杞绘澗鍜屽鏄撱€?/span>

绗竴绔?/span>. 寮€濮?/span>


杩欎竴绔犺妭灏嗗洿缁?/span>Netty鐨勬牳蹇冪粨鏋勫睍寮€锛屽悓鏃堕€氳繃涓€浜涚畝鍗曠殑渚嬪瓙鍙互璁╀綘鏇村揩鐨勪簡瑙?/span>Netty鐨勪娇鐢ㄣ€傚綋浣犺瀹屾湰绔狅紝浣犲皢鏈夎兘鍔涗娇鐢?/span>Netty瀹屾垚瀹㈡埛绔拰鏈嶅姟绔殑寮€鍙戙€?/span>

濡傛灉浣犳洿鍠滄鑷笂鑰屼笅寮忕殑瀛︿範鏂瑰紡锛屼綘鍙互棣栧厛瀹屾垚绗簩绔狅細鏋舵瀯鎬昏鐨勫涔狅紝鐒跺悗鍐嶅洖鍒拌繖閲屻€?/span>

1.1. 寮€濮嬩箣鍓?/span>


杩愯鏈珷绀轰緥绋嬪簭鐨勪袱涓渶浣庤姹傛槸锛氭渶鏂扮増鏈殑Netty绋嬪簭浠ュ強JDK 1.5鎴栨洿楂樼増鏈€傛渶鏂扮増鏈殑Netty绋嬪簭鍙湪椤圭洰涓嬭浇椤?/span>涓嬭浇銆備笅杞芥纭増鏈殑JDK锛岃鍒颁綘鍋忓ソ鐨?/span>JDK绔欑偣涓嬭浇銆?/span>

杩欏氨宸茬粡瓒冲浜嗗悧锛熷疄闄呬笂浣犱細鍙戠幇锛岃繖涓や釜鏉′欢宸茬粡瓒冲浣犲畬鎴愪换浣曞崗璁殑寮€鍙戜簡銆傚鏋滀笉鏄繖鏍凤紝璇疯仈绯?/span>Netty椤圭洰绀惧尯锛岃鎴戜滑鐭ラ亾杩樼己灏戜簡浠€涔堛€?/span>

鏈€缁堜絾涓嶆槸鑷冲皯锛屽綋浣犳兂浜嗚В鏈珷鎵€浠嬬粛鐨勭被鐨勬洿澶氫俊鎭椂璇峰弬鑰?/span>API鎵嬪唽銆備负鏂逛究浣犵殑浣跨敤锛岃繖绡囨枃妗d腑鎵€鏈夌殑绫诲悕鍧囪繛鎺ヨ嚦鍦ㄧ嚎API鎵嬪唽銆傛澶栵紝濡?/span>鏋滄湰绡囨枃妗d腑鏈変换浣曢敊璇俊鎭紝鏃犺鏄娉曢敊璇紝杩樻槸鎵撳嵃鎺掔増閿欒鎴栬€呬綘鏈夋洿濂界殑寤鸿锛岃涓嶈椤捐檻锛岀珛鍗宠仈绯?/span>Netty椤圭洰绀惧尯銆?/span>

1.2. 鎶涘純鍗忚鏈嶅姟


鍦ㄨ繖涓笘鐣屼笂鏈€绠€鍖栫殑鍗忚涓嶆槸鈥淗ello,world!鈥?/span>鑰屾槸鎶涘純鍗忚銆傝繖鏄竴绉嶄涪寮冩帴鏀跺埌鐨勪换浣曟暟鎹苟涓嶅仛浠讳綍鍥炲簲鐨勫崗璁€?/span>

瀹炵幇鎶涘純鍗忚锛?/span>DISCARD protocol锛夛紝浣犱粎闇€瑕佸拷鐣ユ帴鍙楀埌鐨勪换浣曟暟鎹嵆鍙€傝鎴戜滑鐩存帴浠庡鐞嗗櫒锛?/span>handler锛夊疄鐜板紑濮嬶紝杩欎釜澶勭悊鍣ㄥ鐞?/span>Netty鐨勬墍鏈?/span>I/O浜嬩欢銆?/span>

package org.jboss.netty.example.discard;  
@ChannelPipelineCoverage("all")1 
public class DiscardServerHandler extends SimpleChannelHandler {2 
 
    @Override 
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {3 
    }  
 
 @Override 
 public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {4 
     e.getCause().printStackTrace();  
      
     Channel ch = e.getChannel();  
     ch.close();  
 }  

聽聽 浠g爜璇存槑

1)ChannelPipelineCoverage娉ㄨВ浜嗕竴绉嶅鐞嗗櫒绫诲瀷锛岃繖涓敞瑙f爣绀轰簡涓€涓鐞嗗櫒鏄惁鍙澶氫釜Channel閫氶亾鍏变韩锛堝悓鏃跺叧鑱旂潃ChannelPipeline锛夈€?/span>DiscardServerHandler娌℃湁澶勭悊浠讳綍鏈夌姸鎬佺殑淇℃伅锛屽洜姝よ繖閲岀殑娉ㄨВ鏄?/span>鈥渁ll鈥?/span>銆?/span>

2)DiscardServerHandler缁ф壙浜?/span>SimpleChannelHandler锛岃繖涔熸槸涓€涓?/span>ChannelHandler 鐨勫疄鐜般€?/span>SimpleChannelHandler鎻愪緵浜嗗绉嶄綘鍙互閲嶅啓鐨勪簨浠跺鐞嗘柟娉曘€傜洰鍓嶇洿鎺ョ户鎵?/span>SimpleChannelHandler宸茬粡瓒冲浜嗭紝骞朵笉闇€瑕佷綘瀹屾垚涓€涓嚜宸辩殑澶勭悊鍣ㄦ帴鍙c€?/span>

3)鎴戜滑杩欓噷閲嶅啓浜?/span>messageReceived浜嬩欢澶勭悊鏂规硶銆傝繖涓柟娉曠敱涓€涓帴鏀朵簡瀹㈡埛绔紶閫佹暟鎹殑MessageEvent浜嬩欢璋冪敤銆傚湪杩欎釜渚嬪瓙涓紝鎴戜滑蹇界暐鎺ユ敹鍒扮殑浠讳綍鏁版嵁锛屽苟浠ユ鏉ュ疄鐜颁竴涓姏寮冨崗璁紙DISCARD protocol锛夈€?/span>

4)exceptionCaught 浜嬩欢澶勭悊鏂规硶鐢变竴涓?/span>ExceptionEvent寮傚父浜嬩欢璋冪敤锛岃繖涓紓甯镐簨浠惰捣鍥犱簬Netty鐨?/span>I/O寮傚父鎴栦竴涓鐞嗗櫒瀹炵幇鐨勫唴閮ㄥ紓甯搞€傚鏁版儏鍐典笅锛屾崟鎹?/span>鍒扮殑寮傚父搴斿綋琚褰曚笅鏉ワ紝骞跺湪杩欎釜鏂规硶涓叧闂繖涓?/span>channel閫氶亾銆傚綋鐒跺鐞嗚繖绉嶅紓甯告儏鍐电殑鏂规硶瀹炵幇鍙兘鍥犱綘鐨勫疄闄呴渶姹傝€屾湁鎵€涓嶅悓锛屼緥濡傦紝鍦ㄥ叧闂繖涓繛鎺ヤ箣鍓嶄綘鍙兘浼氬彂閫佷竴涓寘鍚簡閿欒鐮佺殑鍝嶅簲娑堟伅銆?/span>

鐩墠杩涘睍涓嶉敊锛屾垜浠凡缁忓畬鎴愪簡鎶涘純鍗忚鏈嶅姟鍣ㄧ殑涓€鍗婂紑鍙戝伐浣溿€備笅闈㈣鍋氱殑鏄畬鎴愪竴涓彲浠ュ惎鍔ㄨ繖涓寘鍚?/span>DiscardServerHandler澶勭悊鍣ㄦ湇鍔$殑涓绘柟娉曘€?/span>

package org.jboss.netty.example.discard;  
 
import java.net.InetSocketAddress;  
import java.util.concurrent.Executors;  
 
public class DiscardServer {  
 
    public static void main(String[] args) throws Exception {  
        ChannelFactory factory =  
            new NioServerSocketChannelFactory (  
                    Executors.newCachedThreadPool(),  
                    Executors.newCachedThreadPool());  
 
        ServerBootstrap bootstrap = new ServerBootstrap (factory);  
 
        DiscardServerHandler handler = new DiscardServerHandler();  
        ChannelPipeline pipeline = bootstrap.getPipeline();  
        pipeline.addLast("handler", handler);  
 
        bootstrap.setOption("child.tcpNoDelay", true);  
        bootstrap.setOption("child.keepAlive", true);  
 
        bootstrap.bind(new InetSocketAddress(8080));  
    }  
} 

浠g爜璇存槑


1)ChannelFactory
鏄竴涓垱寤哄拰绠$悊Channel閫氶亾鍙婂叾鐩稿叧璧勬簮鐨勫伐鍘傛帴鍙o紝瀹冨鐞嗘墍鏈夌殑I/O璇锋眰骞朵骇鐢熺浉搴旂殑I/O ChannelEvent閫氶亾浜嬩欢銆?/span>Netty 鎻愪緵浜嗗绉?/span> ChannelFactory 瀹炵幇銆傝繖閲屾垜浠渶瑕佸疄鐜颁竴涓湇鍔$鐨勪緥瀛愶紝鍥犳鎴戜滑浣跨敤NioServerSocketChannelFactory瀹炵幇銆傚彟涓€浠堕渶瑕佹敞鎰忕殑浜嬫儏鏄繖涓伐鍘傚苟鑷繁涓嶈礋璐e垱寤?/span>I/O绾跨▼銆備綘搴斿綋鍦ㄥ叾鏋勯€犲櫒涓寚瀹氳宸ュ巶浣跨敤鐨勭嚎绋嬫睜锛岃繖鏍峰仛鐨勫ソ澶勬槸浣犺幏寰椾簡鏇撮珮鐨勬帶鍒跺姏鏉ョ鐞嗕綘鐨勫簲鐢ㄧ幆澧冧腑浣跨敤鐨勭嚎绋嬶紝渚嬪涓€涓寘鍚簡瀹夊叏绠$悊鐨勫簲鐢ㄦ湇鍔°€?/span>

2)ServerBootstrap 鏄竴涓缃湇鍔$殑甯姪绫汇€備綘鐢氳嚦鍙互鍦ㄨ繖涓湇鍔′腑鐩存帴璁剧疆涓€涓?/span>Channel閫氶亾銆傜劧鑰岃娉ㄦ剰锛岃繖鏄竴涓箒鐞愮殑杩囩▼锛屽ぇ澶氭暟鎯呭喌涓嬪苟涓嶉渶瑕佽繖鏍峰仛銆?/span>

3)杩欓噷锛屾垜浠皢DiscardServerHandler澶勭悊鍣ㄦ坊鍔犺嚦榛樿鐨?/span>ChannelPipeline閫氶亾銆備换浣曟椂鍊欏綋鏈嶅姟鍣ㄦ帴鏀跺埌涓€涓柊鐨勮繛鎺ワ紝涓€涓柊鐨?/span>ChannelPipeline绠¢亾瀵硅薄灏嗚鍒涘缓锛屽苟涓旀墍鏈夊湪杩欓噷娣诲姞鐨?/span>ChannelHandler瀵硅薄灏嗚娣诲姞鑷宠繖涓柊鐨?/span> ChannelPipeline绠¢亾瀵硅薄銆傝繖寰堝儚鏄竴绉嶆祬鎷疯礉鎿嶄綔锛?/span>a shallow-copy operation锛夛紱鎵€鏈夌殑Channel閫氶亾浠ュ強鍏跺搴旂殑ChannelPipeline瀹炰緥灏嗗垎浜浉鍚岀殑DiscardServerHandler 瀹炰緥銆?/span>

4)浣犱篃鍙互璁剧疆鎴戜滑鍦ㄨ繖閲屾寚瀹氱殑杩欎釜閫氶亾瀹炵幇鐨勯厤缃弬鏁般€傛垜浠鍦ㄥ啓鐨勬槸涓€涓?/span>TCP/IP鏈嶅姟锛屽洜姝ゆ垜浠繍琛岃瀹氫竴浜?/span>socket閫夐」锛屼緥濡?/span> tcpNoDelay鍜?/span>keepAlive銆傝娉ㄦ剰鎴戜滑鍦ㄩ厤缃€夐」閲屾坊鍔犵殑"child."鍓嶇紑銆傝繖鎰忓懗鐫€杩欎釜閰嶇疆椤逛粎閫傜敤浜庢垜浠帴鏀跺埌鐨勯€氶亾瀹炰緥锛岃€屼笉鏄?/span>ServerSocketChannel瀹炰緥銆傚洜姝わ紝浣犲彲浠ヨ繖鏍风粰涓€涓?/span>ServerSocketChannel璁惧畾鍙傛暟锛?/span>
bootstrap.setOption("reuseAddress", true);

5)鎴戜滑缁х画銆傚墿涓嬭鍋氱殑鏄粦瀹氳繖涓湇鍔′娇鐢ㄧ殑绔彛骞朵笖鍚姩杩欎釜鏈嶅姟銆傝繖閲岋紝鎴戜滑缁戝畾鏈満鎵€鏈夌綉鍗★紙NICs,network interface cards锛変笂鐨?/span>8080绔彛銆傚綋鐒讹紝浣犵幇鍦ㄤ篃鍙互瀵瑰簲涓嶅悓鐨勭粦瀹氬湴鍧€澶氭璋冪敤缁戝畾鎿嶄綔銆?/span>

澶у姛鍛婃垚锛佺幇鍦ㄤ綘宸茬粡瀹屾垚浣犵殑绗竴涓熀浜?/span>Netty鐨勬湇鍔$绋嬪簭銆?/span>

1.3. 鏌ョ湅鎺ユ敹鍒扮殑鏁版嵁


鐜板湪浣犲凡缁忓畬鎴愪簡浣犵殑绗竴涓湇鍔$绋嬪簭锛屾垜浠渶瑕佹祴璇曞畠鏄惁鍙互鐪熸鐨勫伐浣溿€傛渶绠€鍗曠殑鏂规硶鏄娇鐢?/span>telnet 鍛戒护銆備緥濡傦紝浣犲彲浠ュ湪鍛戒护琛屼腑杈撳叆鈥渢elnet localhost 8080 鈥?/span>鎴栧叾浠栫被鍨嬪弬鏁般€?/span>

鐒惰€岋紝鎴戜滑鍙互璁や负鏈嶅姟鍣ㄥ湪姝e父宸ヤ綔鍚楋紵鐢变簬杩欐槸涓€涓涪鐞冨崗璁湇鍔★紝鎵€浠ュ疄闄呬笂鎴戜滑鏃犳硶鐪熸鐨勭煡閬撱€備綘鏈€缁堝皢鏀朵笉鍒颁换浣曞洖搴斻€備负浜嗚瘉鏄庡畠鍦ㄧ湡姝g殑宸ヤ綔锛岃鎴戜滑淇敼浠g爜鎵撳嵃鍏舵帴鏀跺埌鐨勬暟鎹€?/span>
鎴戜滑宸茬粡鐭ラ亾褰撳畬鎴愭暟鎹殑鎺ユ敹鍚庡皢浜х敓MessageEvent娑堟伅浜嬩欢锛屽苟涓斾篃浼氳Е鍙?/span>messageReceived澶勭悊鏂规硶銆傛墍浠ヨ鎴戝湪DiscardServerHandler澶勭悊鍣ㄧ殑messageReceived鏂规硶鍐呭鍔犱竴浜涗唬鐮併€?/span>

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {  
    ChannelBuffer  buf = (ChannelBuffer) e.getMessage();  
    while(buf.readable()) {  
        System.out.println((char) buf.readByte());  
    }  
} 

浠g爜璇存槑

1) 鍩烘湰涓婃垜浠彲浠ュ亣瀹氬湪socket鐨勪紶杈撲腑娑堟伅绫诲瀷鎬绘槸ChannelBuffer銆?/span>ChannelBuffer鏄?/span>Netty鐨勪竴涓熀鏈暟鎹粨鏋勶紝杩欎釜鏁?/span>鎹粨鏋勫瓨鍌ㄤ簡涓€涓瓧鑺傚簭鍒椼€?/span>ChannelBuffer绫讳技浜?/span>NIO鐨?/span>ByteBuffer锛屼絾鏄墠鑰呭嵈鏇村姞鐨勭伒娲诲拰鏄撲簬浣跨敤銆備緥濡傦紝Netty鍏佽浣犲垱寤轰竴涓敱澶氫釜ChannelBuffer鏋勫缓鐨勫鍚?/span>ChannelBuffer绫诲瀷锛岃繖鏍峰氨鍙互鍑忓皯涓嶅繀瑕佺殑鍐呭瓨鎷疯礉娆℃暟銆?/span>

2) 铏界劧ChannelBuffer鏈変簺绫讳技浜?/span>NIO鐨?/span>ByteBuffer锛屼絾寮虹儓寤鸿浣犲弬鑰?/span>Netty鐨?/span>API鎵嬪唽銆傚浼氬浣曟纭殑浣跨敤ChannelBuffer鏄棤闅滅浣跨敤Netty鐨勫叧閿竴姝ャ€?/span>

濡傛灉浣犲啀娆¤繍琛?/span>telnet鍛戒护锛屼綘灏嗕細鐪嬪埌浣犳墍鎺ユ敹鍒扮殑鏁版嵁銆?/span>
鎶涘純鍗忚鏈嶅姟鐨勬墍鏈夋簮浠g爜鍧囧瓨鏀惧湪鍦ㄥ垎鍙戠増鐨?/span>org.jboss.netty.example.discard鍖呬笅銆?/span>

1.4. 鍝嶅簲鍗忚鏈嶅姟


鐩墠锛屾垜浠櫧鐒朵娇鐢ㄤ簡鏁版嵁锛屼絾鏈€缁堝嵈鏈綔浠讳綍鍥炲簲銆傜劧鑰屼竴鑸儏鍐典笅锛屼竴涓湇鍔¢兘闇€瑕佸洖搴斾竴涓姹傘€傝鎴戜滑瀹炵幇ECHO鍗忚鏉ュ涔犲浣曞畬鎴愪竴涓鎴疯姹傜殑鍥炲簲娑堟伅锛?/span>ECHO鍗忚瑙勫畾瑕佽繑鍥炰换浣曟帴鏀跺埌鐨勬暟鎹€?/span>

涓庢垜浠笂涓€鑺傚疄鐜扮殑鎶涘純鍗忚鏈嶅姟鍞竴涓嶅悓鐨勫湴鏂规槸锛岃繖閲岄渶瑕佽繑鍥炴墍鏈夌殑鎺ユ敹鏁版嵁鑰屼笉鏄粎浠呮墦鍗板湪鎺у埗鍙颁箣涓娿€傚洜姝ゆ垜浠啀娆′慨鏀?/span>messageReceived鏂规硶灏辫冻澶熶簡銆?/span>

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {  
    Channel  ch = e.getChannel();  
    ch.write(e.getMessage());  
} 

浠g爜璇存槑

1) 涓€涓?/span>ChannelEvent閫氶亾浜嬩欢瀵硅薄鑷韩瀛樻湁涓€涓拰鍏跺叧鑱旂殑Channel瀵硅薄寮曠敤銆傝繖涓繑鍥炵殑Channel閫氶亾瀵硅薄浠h〃浜嗚繖涓帴鏀?/span> MessageEvent娑堟伅浜嬩欢鐨勮繛鎺ワ紙connection锛夈€傚洜姝わ紝鎴戜滑鍙互閫氳繃璋冪敤杩欎釜Channel閫氶亾瀵硅薄鐨?/span>write鏂规硶鍚戣繙绋嬭妭鐐瑰啓鍏ヨ繑鍥炴暟鎹€?/span>

鐜板湪濡傛灉浣犲啀娆¤繍琛?/span>telnet鍛戒护锛屼綘灏嗕細鐪嬪埌鏈嶅姟鍣ㄨ繑鍥炵殑浣犳墍鍙戦€佺殑浠讳綍鏁版嵁銆?/span>

鐩稿簲鏈嶅姟鐨勬墍鏈夋簮浠g爜瀛樻斁鍦ㄥ垎鍙戠増鐨?/span>org.jboss.netty.example.echo鍖呬笅銆?/span>