28

Java的BIO和NIO很难懂?用代码实践给你看,再不懂我转行!-网络编程/专项技术区 - 即...

 4 years ago
source link: http://www.52im.net/thread-2846-1-1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒-缃戠粶缂栫▼/涓撻」鎶€鏈尯 - 鍗虫椂閫氳寮€鍙戣€呯ぞ鍖!
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒

寰俊鎵竴鎵叧娉紒

鏈枃鍘熼鈥滀粠瀹炶返瑙掑害閲嶆柊鐞嗚ВBIO鍜孨IO鈥濓紝鍘熸枃鐢監bject鍒嗕韩锛屼负浜嗘洿濂界殑鍐呭琛ㄧ幇鍔涳紝鍗虫椂閫氳鍦ㄦ敹褰曟椂鏈夋敼鍔ㄣ€傛湰鏂囩殑鏀跺綍宸插緛寰楀師浣滆€呭悓鎰忥紝杞浇璇锋敞鏄庡師浣滆€呬俊鎭紝璇峰皧閲嶅師鍒涚煡璇嗐€

杩欐鏃堕棿鑷繁鍦ㄧ湅涓€浜汮ava涓瑽IO鍜孨IO涔嬬被鐨勪笢瑗匡紝涔熺湅浜嗗緢澶氬崥瀹紝鍙戠幇鍚勭鍏充簬NIO鐨勭悊璁烘蹇佃鐨勫ぉ鑺变贡鍧犲ご澶存槸閬擄紝鍙互璇存槸闈炲父鐨勫畬鏁达紝浣嗘槸鏁翠釜鐪嬩笅鏉ヤ箣鍚庯紝鍙戠幇鑷繁瀵筃IO杩樻槸涓€鐭ュ崐瑙c€佷竴鑴歌挋閫肩殑鐘舵€侊紙璇峰師璋呮垜澶锛夈€

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_nio.jpg



鍩轰簬浠ヤ笂鍘熷洜锛屽氨鏈変簡鍐欐湰鏂囩殑鎯虫硶銆傛湰鏂囦笉浼氭彁鍒板緢澶欽ava NIO鍜孞ava BIO鐨勭悊璁烘蹇碉紙闇€瑕佺殑璇濊鍙傝鏈枃鐨勨€滅浉鍏虫枃绔犫€濅竴鑺傦級锛岃€屾槸绔欏湪缂栫爜瀹炶返鐨勮搴︼紝閫氳繃浠g爜瀹炰緥锛屾€荤粨浜嗘垜鑷繁瀵逛簬Java NIO鐨勮瑙c€傛湁浜嗕唬鐮佸疄璺电殑杩囩▼鍚庡啀閲嶆柊鍥炲ご鐪嬬悊璁烘蹇碉紝浼氭湁涓€涓笉涓€鏍风殑鐞嗚В瑙嗚锛屽笇鏈涜兘鍔╀綘鍚冮€忓畠浠紒

鏈绾﹀畾锛鏈枃鎵€璇寸殑BIO鍗矹ava绋嬪簭鍛樺父璇寸殑缁忓吀闃诲寮廔O锛孨IO鏄寚Java 1.4鐗堝姞鍏ョ殑NIO锛堝嵆寮傛IO锛夈€

2銆佸叧浜庝綔鑰

3銆佺浉鍏虫枃绔

鏈枃涓轰簡閬垮厤杩囧鐨勯槓杩癑ava NIO銆丅IO鐨勬蹇垫€у唴瀹癸紝鍥犺€屽敖閲忓皯鐨勬彁鍙婄浉鍏崇悊璁虹煡璇嗭紝濡傛灉浣犲Java NIO銆丅IO鐨勭悊璁虹煡璇嗘湰鏉ュ氨浜嗚В涓嶅锛屽缓璁繕鏄厛璇讳竴璇诲嵆鏃堕€氳缃戞暣鐞嗕竴涓嬫枃绔狅紝灏嗘湁鍔╀簬浣犳洿濂藉湴鐞嗚В鏈枃銆

4銆佸厛鐢ㄧ粡鍏哥殑BIO鏉ュ疄鐜颁竴涓畝鏄撶殑鍗曠嚎绋嬬綉缁滈€氫俊绋嬪簭

瑕佽鏄庣櫧BIO鍜孨IO锛岄鍏堟垜浠簲璇ヨ嚜宸卞疄鐜颁竴涓畝鏄撶殑鏈嶅姟鍣紝涓嶇敤澶鏉傦紝鍗曠嚎绋嬪嵆鍙€

4.1涓轰粈涔堜娇鐢ㄥ崟绾跨▼浣滀负婕旂ず

鍥犱负鍦ㄥ崟绾跨▼鐜涓嬪彲浠ュ緢濂藉湴瀵规瘮鍑築IO鍜孨IO鐨勪竴涓尯鍒紝褰撶劧鎴戜篃浼氭紨绀哄湪瀹為檯鐜涓瑽IO鐨勬墍璋撲竴涓姹傚搴斾竴涓嚎绋嬬殑鐘跺喌銆

4.2鏈嶅姟绔唬鐮

public class Server {
public static void main(String[] args) {
byte[] buffer = new byte[1024];
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("鏈嶅姟鍣ㄥ凡鍚姩骞剁洃鍚8080绔彛");
while (true) {
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呰繛鎺...");
Socket socket = serverSocket.accept();
System.out.println("鏈嶅姟鍣ㄥ凡鎺ユ敹鍒拌繛鎺ヨ姹...");
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呮暟鎹...");
socket.getInputStream().read(buffer);
System.out.println("鏈嶅姟鍣ㄥ凡缁忔帴鏀跺埌鏁版嵁");
System.out.println();
String content = new String(buffer);
System.out.println("鎺ユ敹鍒扮殑鏁版嵁:" + content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

4.3瀹㈡埛绔唬鐮

public class Consumer {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8080);
socket.getOutputStream().write("鍚戞湇鍔″櫒鍙戞暟鎹".getBytes());
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

4.4浠g爜瑙f瀽

鎴戜滑棣栧厛鍒涘缓浜嗕竴涓湇鍔$绫伙紝鍦ㄧ被涓疄鐜板疄渚嬪寲浜嗕竴涓猄ocketServer骞剁粦瀹氫簡8080绔彛銆備箣鍚庤皟鐢╝ccept鏂规硶鏉ユ帴鏀惰繛鎺ヨ姹傦紝骞朵笖璋冪敤read鏂规硶鏉ユ帴鏀跺鎴风鍙戦€佺殑鏁版嵁銆傛渶鍚庡皢鎺ユ敹鍒扮殑鏁版嵁鎵撳嵃銆

瀹屾垚浜嗘湇鍔$鐨勮璁″悗锛屾垜浠潵瀹炵幇涓€涓鎴风锛岄鍏堝疄渚嬪寲Socket瀵硅薄锛屽苟涓旂粦瀹歩p涓127.0.0.1锛堟湰鏈猴級锛岀鍙e彿涓8080锛岃皟鐢╳rite鏂规硶鍚戞湇鍔″櫒鍙戦€佹暟鎹€

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_1.jpg

4.5杩愯缁撴灉

褰撴垜浠惎鍔ㄦ湇鍔″櫒锛屼絾瀹㈡埛绔繕娌℃湁鍚戞湇鍔″櫒鍙戣捣杩炴帴鏃讹紝鎺у埗鍙扮粨鏋滃涓嬶細
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_2.png



褰撳鎴风鍚姩骞跺悜鏈嶅姟鍣ㄥ彂閫佹暟鎹悗锛屾帶鍒跺彴缁撴灉濡備笅锛

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_3.png

4.6缁撹

浠庝笂闈㈢殑杩愯缁撴灉锛岄鍏堟垜浠嚦灏戝彲浠ョ湅鍒帮紝鍦ㄦ湇鍔″櫒鍚姩鍚庯紝瀹㈡埛绔繕娌℃湁杩炴帴鏈嶅姟鍣ㄦ椂锛屾湇鍔″櫒鐢变簬璋冪敤浜哸ccept鏂规硶锛屽皢涓€鐩撮樆濉烇紝鐩村埌鏈夊鎴风璇锋眰杩炴帴鏈嶅姟鍣ㄣ€

5銆佸瀹㈡埛绔姛鑳借繘琛屾墿灞

鍦ㄤ笂鑺備腑锛屾垜浠疄鐜扮殑瀹㈡埛绔殑閫昏緫涓昏鏄細寤虹珛Socket 鈥> 杩炴帴鏈嶅姟鍣 鈥> 鍙戦€佹暟鎹紝鎴戜滑鐨勬暟鎹槸鍦ㄨ繛鎺ユ湇鍔″櫒涔嬪悗灏辩珛鍗冲彂閫佺殑锛岀幇鍦ㄦ垜浠潵瀵瑰鎴风杩涜涓€娆℃墿灞曪紝褰撴垜浠繛鎺ユ湇鍔″櫒鍚庯紝涓嶇珛鍗冲彂閫佹暟鎹紝鑰屾槸绛夊緟鎺у埗鍙版墜鍔ㄨ緭鍏ユ暟鎹悗锛屽啀鍙戦€佺粰鏈嶅姟绔€傦紙娉ㄦ剰锛氭湰鑺備腑锛屾湇鍔$浠g爜淇濇寔涓嶅彉锛

5.1鏀硅繘鍚庣殑浠g爜

public class Consumer {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8080);
String message = null;
Scanner sc = new Scanner(System.in);
message = sc.next();
socket.getOutputStream().write(message.getBytes());
socket.close();
sc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

5.2娴嬭瘯

褰撴湇鍔$鍚姩锛屽鎴风杩樻病鏈夎姹傝繛鎺ユ湇鍔″櫒鏃讹紝鎺у埗鍙扮粨鏋滃涓嬶細
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_4.png



褰撴湇鍔$鍚姩锛屽鎴风杩炴帴鏈嶅姟绔紝浣嗘病鏈夊彂閫佹暟鎹椂锛屾帶鍒跺彴缁撴灉濡備笅锛

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_5.png



褰撴湇鍔$鍚姩锛屽鎴风杩炴帴鏈嶅姟绔紝骞朵笖鍙戦€佹暟鎹椂锛屾帶鍒跺彴缁撴灉濡備笅锛

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_6.png

5.3缁撹

浠庝笂闈㈢殑杩愯缁撴灉涓垜浠彲浠ョ湅鍒帮紝鏈嶅姟鍣ㄧ鍦ㄥ惎鍔ㄥ悗锛
  • 1锛夐鍏堥渶瑕佺瓑寰呭鎴风鐨勮繛鎺ヨ姹傦紙绗竴娆¢樆濉烇級锛
  • 2锛夊鏋滄病鏈夊鎴风杩炴帴锛屾湇鍔$灏嗕竴鐩撮樆濉炵瓑寰咃紱
  • 3锛夌劧鍚庡綋瀹㈡埛绔繛鎺ュ悗锛屾湇鍔″櫒浼氱瓑寰呭鎴风鍙戦€佹暟鎹紙绗簩娆¢樆濉烇級锛
  • 4锛夊鏋滃鎴风娌℃湁鍙戦€佹暟鎹紝閭d箞鏈嶅姟绔皢浼氫竴鐩撮樆濉炵瓑寰呭鎴风鍙戦€佹暟鎹€
鏈嶅姟绔粠鍚姩鍒版敹鍒板鎴风鏁版嵁鐨勮繖涓繃绋嬶紝灏嗕細鏈変袱娆¢樆濉炵殑杩囩▼锛
  • 1锛夌涓€娆″湪绛夊緟杩炴帴鏃堕樆濉烇紱
  • 2锛夌浜屾鍦ㄧ瓑寰呮暟鎹椂闃诲銆
BIO浼氫骇鐢熶袱娆¢樆濉烇紝杩欏氨鏄疊IO鐨勯潪甯搁噸瑕佺殑涓€涓壒鐐广€

6銆丅IO

6.1鍦ㄥ崟绾跨▼鏉′欢涓婤IO鐨勫急鐐

鍦ㄤ笂涓よ妭涓紝鎴戜滑鐢ㄧ粡鍏哥殑Java BIO瀹炵幇浜嗕竴涓畝鏄撶殑缃戠粶閫氫俊绋嬪簭锛岃繖涓畝鏄撶殑绋嬪簭鏄互鍗曠嚎绋嬭繍琛岀殑銆

鍏跺疄鎴戜滑涓嶉毦鐪嬪嚭锛褰撴垜浠殑鏈嶅姟鍣ㄦ帴鏀跺埌涓€涓繛鎺ュ悗锛屽苟涓旀病鏈夋帴鏀跺埌瀹㈡埛绔彂閫佺殑鏁版嵁鏃讹紝鏄細闃诲鍦╮ead()鏂规硶涓殑锛岄偅涔堟鏃跺鏋滃啀鏉ヤ竴涓鎴风鐨勮姹傦紝鏈嶅姟绔槸鏃犳硶杩涜鍝嶅簲鐨勩€鎹㈣█涔嬶細鍦ㄤ笉鑰冭檻澶氱嚎绋嬬殑鎯呭喌涓嬶紝BIO鏄棤娉曞鐞嗗涓鎴风璇锋眰鐨勩€

6.2BIO濡備綍澶勭悊骞跺彂

鍦ㄤ笂闈㈢殑鏈嶅姟鍣ㄥ疄鐜颁腑锛屾垜浠疄鐜扮殑鏄崟绾跨▼鐗堢殑BIO鏈嶅姟鍣紝涓嶉毦鐪嬪嚭锛屽崟绾跨▼鐗堢殑BIO骞朵笉鑳藉鐞嗗涓鎴风鐨勮姹傦紝閭d箞濡備綍鑳戒娇BIO澶勭悊澶氫釜瀹㈡埛绔姹傚憿銆

鍏跺疄涓嶉毦鎯冲埌锛鎴戜滑鍙渶瑕佸湪姣忎竴涓繛鎺ヨ姹傚埌鏉ユ椂锛屽垱寤轰竴涓嚎绋嬪幓鎵ц杩欎釜杩炴帴璇锋眰锛屽氨鍙互鍦˙IO涓鐞嗗涓鎴风璇锋眰浜嗭紝杩欎篃灏辨槸涓轰粈涔圔IO鐨勫叾涓竴鏉℃蹇垫槸鏈嶅姟鍣ㄥ疄鐜版ā寮忎负涓€涓繛鎺ヤ竴涓嚎绋嬶紝鍗冲鎴风鏈夎繛鎺ヨ姹傛椂鏈嶅姟鍣ㄧ灏遍渶瑕佸惎鍔ㄤ竴涓嚎绋嬭繘琛屽鐞嗐€

6.3澶氱嚎绋婤IO鏈嶅姟鍣ㄧ畝鏄撳疄鐜

public class Server {
public static void main(String[] args) {
byte[] buffer = new byte[1024];
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("鏈嶅姟鍣ㄥ凡鍚姩骞剁洃鍚8080绔彛");
while (true) {
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呰繛鎺...");
Socket socket = serverSocket.accept();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("鏈嶅姟鍣ㄥ凡鎺ユ敹鍒拌繛鎺ヨ姹...");
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呮暟鎹...");
try {
socket.getInputStream().read(buffer);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("鏈嶅姟鍣ㄥ凡缁忔帴鏀跺埌鏁版嵁");
System.out.println();
String content = new String(buffer);
System.out.println("鎺ユ敹鍒扮殑鏁版嵁:" + content);
}
}).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

6.4杩愯缁撴灉

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_7.png



Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_8.png



寰堟槑鏄撅紝鐜板湪鎴戜滑鐨勬湇鍔″櫒鐨勭姸鎬佸氨鏄竴涓嚎绋嬪搴斾竴涓姹傦紝鎹㈣█涔嬶紝鏈嶅姟鍣ㄤ负姣忎竴涓繛鎺ヨ姹傞兘鍒涘缓浜嗕竴涓嚎绋嬫潵澶勭悊銆

6.5澶氱嚎绋婤IO鏈嶅姟鍣ㄧ殑寮婄

澶氱嚎绋婤IO鏈嶅姟鍣ㄨ櫧鐒惰В鍐充簡鍗曠嚎绋婤IO鏃犳硶澶勭悊骞跺彂鐨勫急鐐癸紝浣嗘槸涔熷甫鏉ヤ竴涓棶棰橈細濡傛灉鏈夊ぇ閲忕殑璇锋眰杩炴帴鍒版垜浠殑鏈嶅姟鍣ㄤ笂锛屼絾鏄嵈涓嶅彂閫佹秷鎭紝閭d箞鎴戜滑鐨勬湇鍔″櫒涔熶細涓鸿繖浜涗笉鍙戦€佹秷鎭殑璇锋眰鍒涘缓涓€涓崟鐙殑绾跨▼锛岄偅涔堝鏋滆繛鎺ユ暟灏戣繕濂斤紝杩炴帴鏁颁竴澶氬氨浼氬鏈嶅姟绔€犳垚鏋佸ぇ鐨勫帇鍔涖€

鎵€浠ワ細濡傛灉杩欑涓嶆椿璺冪殑绾跨▼姣旇緝澶氾紝鎴戜滑搴旇閲囧彇鍗曠嚎绋嬬殑涓€涓В鍐虫柟妗堬紝浣嗘槸鍗曠嚎绋嬪張鏃犳硶澶勭悊骞跺彂锛岃繖灏遍櫡鍏ヤ簡涓€绉嶅緢鐭涚浘鐨勭姸鎬侊紝浜庢槸灏辨湁浜哊IO銆

7銆丯IO

棰樺璇濓細濡傛灉浣犲Java鐨凬IO鐞嗚鐭ヨ瘑浜嗚В鐨勫お灏戯紝寤鸿浼樺厛璇讳竴涓嬭繖涓ょ瘒鏂囩珷锛屻€灏戝暟鍡︼紒涓€鍒嗛挓甯︿綘璇绘噦Java鐨凬IO鍜岀粡鍏窱O鐨勫尯鍒銆嬨€併€鍙蹭笂鏈€寮篔ava NIO鍏ラ棬锛氭媴蹇冧粠鍏ラ棬鍒版斁寮冪殑锛岃璇昏繖绡囷紒銆嬨€

7.1NIO鐨勫紩鍏

鎴戜滑鍏堟潵鐪嬬湅鍗曠嚎绋嬫ā寮忎笅BIO鏈嶅姟鍣ㄧ殑浠g爜锛屽叾瀹濶IO闇€瑕佽В鍐崇殑鏈€鏍规湰鐨勯棶棰樺氨鏄瓨鍦ㄤ簬BIO涓殑涓や釜闃诲锛屽垎鍒槸绛夊緟杩炴帴鏃剁殑闃诲鍜岀瓑寰呮暟鎹椂鐨勯樆濉炪€
public class Server {
public static void main(String[] args) {
byte[] buffer = new byte[1024];
try {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("鏈嶅姟鍣ㄥ凡鍚姩骞剁洃鍚8080绔彛");
while (true) {
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呰繛鎺...");
//闃诲1锛氱瓑寰呰繛鎺ユ椂闃诲
Socket socket = serverSocket.accept();
System.out.println("鏈嶅姟鍣ㄥ凡鎺ユ敹鍒拌繛鎺ヨ姹...");
System.out.println();
System.out.println("鏈嶅姟鍣ㄦ鍦ㄧ瓑寰呮暟鎹...");
//闃诲2锛氱瓑寰呮暟鎹椂闃诲
socket.getInputStream().read(buffer);
System.out.println("鏈嶅姟鍣ㄥ凡缁忔帴鏀跺埌鏁版嵁");
System.out.println();
String content = new String(buffer);
System.out.println("鎺ユ敹鍒扮殑鏁版嵁:" + content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
鎴戜滑闇€瑕佸啀鑰佽皟閲嶈皥鐨勪竴鐐规槸锛屽鏋滃崟绾跨▼鏈嶅姟鍣ㄥ湪绛夊緟鏁版嵁鏃堕樆濉烇紝閭d箞绗簩涓繛鎺ヨ姹傚埌鏉ユ椂锛屾湇鍔″櫒鏄棤娉曞搷搴旂殑銆傚鏋滄槸澶氱嚎绋嬫湇鍔″櫒锛岄偅涔堝張浼氭湁涓哄ぇ閲忕┖闂茶姹備骇鐢熸柊绾跨▼浠庤€岄€犳垚绾跨▼鍗犵敤绯荤粺璧勬簮锛岀嚎绋嬫氮璐圭殑鎯呭喌銆

閭d箞鎴戜滑鐨勯棶棰樺氨杞Щ鍒帮紝濡備綍璁╁崟绾跨▼鏈嶅姟鍣ㄥ湪绛夊緟瀹㈡埛绔暟鎹埌鏉ユ椂锛屼緷鏃у彲浠ユ帴鏀舵柊鐨勫鎴风杩炴帴璇锋眰銆

7.2妯℃嫙NIO瑙e喅鏂规

濡傛灉瑕佽В鍐充笂鏂囦腑鎻愬埌鐨勫崟绾跨▼鏈嶅姟鍣ㄦ帴鏀舵暟鎹椂闃诲锛岃€屾棤娉曟帴鏀舵柊璇锋眰鐨勯棶棰橈紝閭d箞鍏跺疄鍙互璁╂湇鍔″櫒鍦ㄧ瓑寰呮暟鎹椂涓嶈繘鍏ラ樆濉炵姸鎬侊紝闂涓嶅氨杩庡垉鑰岃В浜嗗悧锛

銆愮涓€绉嶈В鍐虫柟妗堬紙绛夊緟杩炴帴鏃跺拰绛夊緟鏁版嵁鏃朵笉闃诲锛夈€戯細
public class Server {
public static void main(String[] args) throws InterruptedException {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
try {
//Java涓洪潪闃诲璁剧疆鐨勭被
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
//璁剧疆涓洪潪闃诲
serverSocketChannel.configureBlocking(false);
while(true) {
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel==null) {
//琛ㄧず娌′汉杩炴帴
System.out.println("姝e湪绛夊緟瀹㈡埛绔姹傝繛鎺...");
Thread.sleep(5000);
}else {
System.out.println("褰撳墠鎺ユ敹鍒板鎴风璇锋眰杩炴帴...");
}
if(socketChannel!=null) {
//璁剧疆涓洪潪闃诲
socketChannel.configureBlocking(false);
byteBuffer.flip();//鍒囨崲妯″紡聽 鍐-->璇
int effective = socketChannel.read(byteBuffer);
if(effective!=0) {
String content = Charset.forName("utf-8").decode(byteBuffer).toString();
System.out.println(content);
}else {
System.out.println("褰撳墠鏈敹鍒板鎴风娑堟伅");
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
杩愯缁撴灉锛
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_9.png



浠g爜瑙f瀽锛

涓嶉毦鐪嬪嚭锛屽湪杩欑瑙e喅鏂规涓嬶紝铏界劧鍦ㄦ帴鏀跺鎴风娑堟伅鏃朵笉浼氶樆濉烇紝浣嗘槸鍙堝紑濮嬮噸鏂版帴鏀舵湇鍔″櫒璇锋眰锛岀敤鎴锋牴鏈潵涓嶅強杈撳叆娑堟伅锛屾湇鍔″櫒灏辫浆鍚戞帴鏀跺埆鐨勫鎴风璇锋眰浜嗭紝鎹㈣█涔嬶紝鏈嶅姟鍣ㄥ紕涓簡褰撳墠瀹㈡埛绔殑璇锋眰銆

銆愯В鍐虫柟妗堜簩锛堢紦瀛楽ocket锛岃疆璇㈡暟鎹槸鍚﹀噯澶囧ソ锛夈€戯細
public class Server {
public static void main(String[] args) throws InterruptedException {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
List<SocketChannel> socketList = new ArrayList<SocketChannel>();
try {
//Java涓洪潪闃诲璁剧疆鐨勭被
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(8080));
//璁剧疆涓洪潪闃诲
serverSocketChannel.configureBlocking(false);
while(true) {
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel==null) {
//琛ㄧず娌′汉杩炴帴
System.out.println("姝e湪绛夊緟瀹㈡埛绔姹傝繛鎺...");
Thread.sleep(5000);
}else {
System.out.println("褰撳墠鎺ユ敹鍒板鎴风璇锋眰杩炴帴...");
socketList.add(socketChannel);
}
for(SocketChannel socket:socketList) {
socket.configureBlocking(false);
int effective = socket.read(byteBuffer);
if(effective!=0) {
byteBuffer.flip();//鍒囨崲妯″紡聽 鍐-->璇
String content = Charset.forName("UTF-8").decode(byteBuffer).toString();
System.out.println("鎺ユ敹鍒版秷鎭:"+content);
byteBuffer.clear();
}else {
System.out.println("褰撳墠鏈敹鍒板鎴风娑堟伅");
}
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
杩愯缁撴灉锛
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_10.png


Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_11.png



浠g爜瑙f瀽锛

鍦ㄨВ鍐虫柟妗堜竴涓紝鎴戜滑閲囩敤浜嗛潪闃诲鏂瑰紡锛屼絾鏄彂鐜颁竴鏃﹂潪闃诲锛岀瓑寰呭鎴风鍙戦€佹秷鎭椂灏变笉浼氬啀闃诲浜嗭紝鑰屾槸鐩存帴閲嶆柊鍘昏幏鍙栨柊瀹㈡埛绔殑杩炴帴璇锋眰锛岃繖灏变細閫犳垚瀹㈡埛绔繛鎺ヤ涪澶便€

鑰屽湪瑙e喅鏂规浜屼腑锛屾垜浠皢杩炴帴瀛樺偍鍦ㄤ竴涓猯ist闆嗗悎涓紝姣忔绛夊緟瀹㈡埛绔秷鎭椂閮藉幓杞锛岀湅鐪嬫秷鎭槸鍚﹀噯澶囧ソ锛屽鏋滃噯澶囧ソ鍒欑洿鎺ユ墦鍗版秷鎭€

鍙互鐪嬪埌锛屼粠澶村埌灏炬垜浠竴鐩存病鏈夊紑鍚浜屼釜绾跨▼锛岃€屾槸涓€鐩撮噰鐢ㄥ崟绾跨▼鏉ュ鐞嗗涓鎴风鐨勮繛鎺ワ紝杩欐牱鐨勪竴涓ā寮忓彲浠ュ緢瀹岀編鍦拌В鍐矪IO鍦ㄥ崟绾跨▼妯″紡涓嬫棤娉曞鐞嗗瀹㈡埛绔姹傜殑闂锛屽苟涓旇В鍐充簡闈為樆濉炵姸鎬佷笅杩炴帴涓㈠け鐨勯棶棰樸€

7.3瀛樺湪鐨勯棶棰橈紙瑙e喅鏂规浜岋級

浠庡垰鎵嶇殑杩愯缁撴灉涓叾瀹炲彲浠ョ湅鍑猴紝娑堟伅娌℃湁涓㈠け锛岀▼搴忎篃娌℃湁闃诲銆

浣嗘槸锛屽湪鎺ユ敹娑堟伅鐨勬柟寮忎笂鍙兘鏈変簺璁镐笉濡ワ紝鎴戜滑閲囩敤浜嗕竴涓疆璇㈢殑鏂瑰紡鏉ユ帴鏀舵秷鎭紝姣忔閮借疆璇㈡墍鏈夌殑杩炴帴锛岀湅娑堟伅鏄惁鍑嗗濂斤紝娴嬭瘯鐢ㄤ緥涓彧鏄笁涓繛鎺ワ紝鎵€浠ョ湅涓嶅嚭浠€涔堥棶棰樻潵锛屼絾鏄垜浠亣璁炬湁1000涓囪繛鎺ワ紝鐢氳嚦鏇村锛岄噰鐢ㄨ繖绉嶈疆璇㈢殑鏂瑰紡鏁堢巼鏄瀬浣庣殑銆

鍙﹀锛1000涓囪繛鎺ヤ腑锛屾垜浠彲鑳藉彧浼氭湁100涓囦細鏈夋秷鎭紝鍓╀笅鐨900涓囧苟涓嶄細鍙戦€佷换浣曟秷鎭紝閭d箞杩欎簺杩炴帴绋嬪簭渚濇棫瑕佹瘡娆¢兘鍘昏疆璇紝杩欐樉鐒舵槸涓嶅悎閫傜殑銆

7.4鐪熷疄NIO涓浣曡В鍐

鍦ㄧ湡瀹濶IO涓紝骞朵笉浼氬湪Java灞備笂鏉ヨ繘琛屼竴涓疆璇紝鑰屾槸灏嗚疆璇㈢殑杩欎釜姝ラ浜ょ粰鎴戜滑鐨勬搷浣滅郴缁熸潵杩涜锛屼粬灏嗚疆璇㈢殑閭i儴鍒嗕唬鐮佹敼涓烘搷浣滅郴缁熺骇鍒殑绯荤粺璋冪敤锛坰elect鍑芥暟锛屽湪linux鐜涓负epoll锛夛紝鍦ㄦ搷浣滅郴缁熺骇鍒笂璋冪敤select鍑芥暟锛屼富鍔ㄥ湴鍘绘劅鐭ユ湁鏁版嵁鐨剆ocket銆

杩欐柟闈㈢殑鐭ヨ瘑锛屽缓璁璇讳互涓嬫枃绔狅細

8銆佸叧浜庝娇鐢╯elect/epoll鍜岀洿鎺ュ湪搴旂敤灞傚仛杞鐨勫尯鍒

鎴戜滑鍦ㄤ箣鍓嶅疄鐜颁簡涓€涓娇鐢↗ava鍋氬涓鎴风杩炴帴杞鐨勯€昏緫锛屼絾鏄湪鐪熸鐨凬IO婧愮爜涓叾瀹炲苟涓嶆槸杩欎箞瀹炵幇鐨勶紝NIO浣跨敤浜嗘搷浣滅郴缁熷簳灞傜殑杞绯荤粺璋冪敤 select/epoll(windows:select,linux:epoll)锛岄偅涔堜负浠€涔堜笉鐩存帴瀹炵幇鑰岃鍘昏皟鐢ㄧ郴缁熸潵鍋氳疆璇㈠憿锛

8.1select搴曞眰閫昏緫

Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒_12.jpg



鍋囪鏈堿銆丅銆丆銆丏銆丒浜斾釜杩炴帴鍚屾椂杩炴帴鏈嶅姟鍣紝閭d箞鏍规嵁鎴戜滑涓婃枃涓殑璁捐锛岀▼搴忓皢浼氶亶鍘嗚繖浜斾釜杩炴帴锛岃疆璇㈡瘡涓繛鎺ワ紝鑾峰彇鍚勮嚜鏁版嵁鍑嗗鎯呭喌锛岄偅涔堝拰鎴戜滑鑷繁鍐欑殑绋嬪簭鏈変粈涔堝尯鍒憿锛

棣栧厛锛鎴戜滑鍐欑殑Java绋嬪簭鍏舵湰璐ㄥ湪杞姣忎釜Socket鐨勬椂鍊欎篃闇€瑕佸幓璋冪敤绯荤粺鍑芥暟锛岄偅涔堣疆璇竴娆¤皟鐢ㄤ竴娆★紝浼氶€犳垚涓嶅繀瑕佺殑涓婁笅鏂囧垏鎹㈠紑閿€銆

鑰岋細Select浼氬皢浜斾釜璇锋眰浠庣敤鎴锋€佺┖闂村叏閲忓鍒朵竴浠藉埌鍐呮牳鎬佺┖闂达紝鍦ㄥ唴鏍告€佺┖闂存潵鍒ゆ柇姣忎釜璇锋眰鏄惁鍑嗗濂芥暟鎹紝瀹屽叏閬垮厤棰戠箒鐨勪笂涓嬫枃鍒囨崲銆傛墍浠ユ晥鐜囨槸姣旀垜浠洿鎺ュ湪搴旂敤灞傚啓杞瑕侀珮鐨勩€

濡傛灉锛select娌℃湁鏌ヨ鍒板埌鏈夋暟鎹殑璇锋眰锛岄偅涔堝皢浼氫竴鐩撮樆濉烇紙鏄殑锛宻elect鏄竴涓樆濉炲嚱鏁帮級銆傚鏋滄湁涓€涓垨鑰呭涓姹傚凡缁忓噯澶囧ソ鏁版嵁浜嗭紝閭d箞select灏嗕細鍏堝皢鏈夋暟鎹殑鏂囦欢鎻忚堪绗︾疆浣嶏紝鐒跺悗select杩斿洖銆傝繑鍥炲悗閫氳繃閬嶅巻鏌ョ湅鍝釜璇锋眰鏈夋暟鎹€

select鐨勭己鐐癸細

  • 1锛夊簳灞傚瓨鍌ㄤ緷璧朾itmap锛屽鐞嗙殑璇锋眰鏄湁涓婇檺鐨勶紝涓1024锛
  • 2锛夋枃浠舵弿杩扮鏄細缃綅鐨勶紝鎵€浠ュ鏋滃綋琚疆浣嶇殑鏂囦欢鎻忚堪绗﹂渶瑕侀噸鏂颁娇鐢ㄦ椂锛屾槸闇€瑕侀噸鏂拌祴绌哄€肩殑锛
  • 3锛塮d锛堟枃浠舵弿杩扮锛変粠鐢ㄦ埛鎬佹嫹璐濆埌鍐呮牳鎬佷粛鐒舵湁涓€绗斿紑閿€锛
  • 4锛塻elect杩斿洖鍚庤繕瑕佸啀娆¢亶鍘嗭紝鏉ヨ幏鐭ユ槸鍝竴涓姹傛湁鏁版嵁銆

8.2poll鍑芥暟搴曞眰閫昏緫

poll鐨勫伐浣滃師鐞嗗拰select寰堝儚锛屽厛鏉ョ湅涓€娈祊oll鍐呴儴浣跨敤鐨勪竴涓粨鏋勪綋銆
struct pollfd{
int fd;
short events;
short revents;
}
poll鍚屾牱浼氬皢鎵€鏈夌殑璇锋眰鎷疯礉鍒板唴鏍告€侊紝鍜宻elect涓€鏍凤紝poll鍚屾牱鏄竴涓樆濉炲嚱鏁帮紝褰撲竴涓垨澶氫釜璇锋眰鏈夋暟鎹殑鏃跺€欙紝涔熷悓鏍蜂細杩涜缃綅锛屼絾鏄畠缃綅鐨勬槸缁撴瀯浣損ollfd涓殑events鎴栬€卹events缃綅锛岃€屼笉鏄fd鏈韩杩涜缃綅锛屾墍浠ュ湪涓嬩竴娆′娇鐢ㄧ殑鏃跺€欎笉闇€瑕佸啀杩涜閲嶆柊璧嬬┖鍊肩殑鎿嶄綔銆俻oll鍐呴儴瀛樺偍涓嶄緷璧朾itmap锛岃€屾槸浣跨敤pollfd鏁扮粍鐨勮繖鏍蜂竴涓暟鎹粨鏋勶紝鏁扮粍鐨勫ぇ灏忚偗瀹氭槸澶т簬1024鐨勩€傝В鍐充簡select 1銆2涓ょ偣鐨勭己鐐广€

8.3epoll鍑芥暟搴曞眰閫昏緫

epoll鏄渶鏂扮殑涓€绉嶅璺疘O澶嶇敤鐨勫嚱鏁般€傝繖閲屽彧璇磋瀹冪殑鐗圭偣銆

epoll鍜屼笂杩颁袱涓嚱鏁版渶澶х殑涓嶅悓鏄紝瀹冪殑fd鏄叡浜湪鐢ㄦ埛鎬佸拰鍐呮牳鎬佷箣闂寸殑锛屾墍浠ュ彲浠ヤ笉蹇呰繘琛屼粠鐢ㄦ埛鎬佸埌鍐呮牳鎬佺殑涓€涓嫹璐濓紝杩欐牱鍙互鑺傜害绯荤粺璧勬簮銆

鍙﹀锛屽湪select鍜宲oll涓紝濡傛灉鏌愪釜璇锋眰鐨勬暟鎹凡缁忓噯澶囧ソ锛屽畠浠細灏嗘墍鏈夌殑璇锋眰閮借繑鍥烇紝渚涚▼搴忓幓閬嶅巻鏌ョ湅鍝釜璇锋眰瀛樺湪鏁版嵁锛屼絾鏄痚poll鍙細杩斿洖瀛樺湪鏁版嵁鐨勮姹傦紝杩欐槸鍥犱负epoll鍦ㄥ彂鐜版煇涓姹傚瓨鍦ㄦ暟鎹椂锛岄鍏堜細杩涜涓€涓噸鎺掓搷浣滐紝灏嗘墍鏈夋湁鏁版嵁鐨刦d鏀惧埌鏈€鍓嶉潰鐨勪綅缃紝鐒跺悗杩斿洖锛堣繑鍥炲€间负瀛樺湪鏁版嵁璇锋眰鐨勪釜鏁癗锛夛紝閭d箞鎴戜滑鐨勪笂灞傜▼搴忓氨鍙互涓嶅繀灏嗘墍鏈夎姹傞兘杞锛岃€屾槸鐩存帴閬嶅巻epoll杩斿洖鐨勫墠N涓姹傦紝杩欎簺璇锋眰閮芥槸鏈夋暟鎹殑璇锋眰銆

浠ヤ笂鏈夊叧楂樻€ц兘绾跨▼銆佺綉缁淚O妯″瀷鐨勭煡璇嗭紝鍙互璇﹁浠ヤ笅鍑犵瘒锛

9銆丣ava涓瑽IO鍜孨IO鐨勬蹇垫€荤粨

閫氬父涓€浜涙枃绔犻兘鏄湪寮€澶存斁涓婃蹇碉紝浣嗘槸鎴戣繖娆¢€夋嫨灏嗘蹇垫斁鍦ㄧ粨灏撅紝鍥犱负閫氳繃涓婇潰鐨勫疄鎿嶏紝鐩镐俊澶у瀵笿ava涓瑽IO鍜孨IO閮芥湁浜嗚嚜宸辩殑涓€浜涚悊瑙o紝杩欐椂鍊欏啀鏉ョ湅姒傚康搴旇浼氭洿濂界悊瑙d竴浜涗簡銆

鍏堟潵涓緥瀛愮悊瑙d竴涓嬫蹇碉紝浠ラ摱琛屽彇娆句负渚嬶細
  • 1锛夊悓姝 锛 鑷繁浜茶嚜鍑洪┈鎸侀摱琛屽崱鍒伴摱琛屽彇閽憋紙浣跨敤鍚屾IO鏃讹紝Java鑷繁澶勭悊IO璇诲啓锛夛紱
  • 3锛夊紓姝 锛 濮旀墭涓€灏忓紵鎷块摱琛屽崱鍒伴摱琛屽彇閽憋紝鐒跺悗缁欎綘锛堜娇鐢ㄥ紓姝O鏃讹紝Java灏咺O璇诲啓濮旀墭缁橭S澶勭悊锛岄渶瑕佸皢鏁版嵁缂撳啿鍖哄湴鍧€鍜屽ぇ灏忎紶缁橭S(閾惰鍗″拰瀵嗙爜)锛孫S闇€瑕佹敮鎸佸紓姝O鎿嶄綔API锛夛紱
  • 3锛夐樆濉 锛 ATM鎺掗槦鍙栨锛屼綘鍙兘绛夊緟锛堜娇鐢ㄩ樆濉濱O鏃讹紝Java璋冪敤浼氫竴鐩撮樆濉炲埌璇诲啓瀹屾垚鎵嶈繑鍥烇級锛
  • 4锛夐潪闃诲 锛 鏌滃彴鍙栨锛屽彇涓彿锛岀劧鍚庡潗鍦ㄦ瀛愪笂鍋氬叾瀹冧簨锛岀瓑鍙峰箍鎾細閫氱煡浣犲姙鐞嗭紝娌″埌鍙蜂綘灏变笉鑳藉幓锛屼綘鍙互涓嶆柇闂ぇ鍫傜粡鐞嗘帓鍒颁簡娌℃湁锛屽ぇ鍫傜粡鐞嗗鏋滆杩樻病鍒颁綘灏变笉鑳藉幓锛堜娇鐢ㄩ潪闃诲IO鏃讹紝濡傛灉涓嶈兘璇诲啓Java璋冪敤浼氶┈涓婅繑鍥烇紝褰揑O浜嬩欢鍒嗗彂鍣ㄤ細閫氱煡鍙鍐欐椂鍐嶇户缁繘琛岃鍐欙紝涓嶆柇寰幆鐩村埌璇诲啓瀹屾垚锛夈€
Java瀵笲IO銆丯IO鐨勬敮鎸侊細
  • 1锛塉ava BIO (blocking I/O)锛毬犅犲悓姝ュ苟闃诲锛屾湇鍔″櫒瀹炵幇妯″紡涓轰竴涓繛鎺ヤ竴涓嚎绋嬶紝鍗冲鎴风鏈夎繛鎺ヨ姹傛椂鏈嶅姟鍣ㄧ灏遍渶瑕佸惎鍔ㄤ竴涓嚎绋嬭繘琛屽鐞嗭紝濡傛灉杩欎釜杩炴帴涓嶅仛浠讳綍浜嬫儏浼氶€犳垚涓嶅繀瑕佺殑绾跨▼寮€閿€锛屽綋鐒跺彲浠ラ€氳繃绾跨▼姹犳満鍒舵敼鍠勶紱
  • 2锛塉ava NIO (non-blocking I/O)锛 鍚屾闈為樆濉烇紝鏈嶅姟鍣ㄥ疄鐜版ā寮忎负涓€涓姹備竴涓嚎绋嬶紝鍗冲鎴风鍙戦€佺殑杩炴帴璇锋眰閮戒細娉ㄥ唽鍒板璺鐢ㄥ櫒涓婏紝澶氳矾澶嶇敤鍣ㄨ疆璇㈠埌杩炴帴鏈塈/O璇锋眰鏃舵墠鍚姩涓€涓嚎绋嬭繘琛屽鐞嗐€
BIO銆丯IO閫傜敤鍦烘櫙鍒嗘瀽:
  • 1锛塀IO鏂瑰紡锛 閫傜敤浜庤繛鎺ユ暟鐩瘮杈冨皬涓斿浐瀹氱殑鏋舵瀯锛岃繖绉嶆柟寮忓鏈嶅姟鍣ㄨ祫婧愯姹傛瘮杈冮珮锛屽苟鍙戝眬闄愪簬搴旂敤涓紝JDK1.4浠ュ墠鐨勫敮涓€閫夋嫨锛屼絾绋嬪簭鐩磋绠€鍗曟槗鐞嗚В锛
  • 2锛塏IO鏂瑰紡锛 閫傜敤浜庤繛鎺ユ暟鐩涓旇繛鎺ユ瘮杈冪煭锛堣交鎿嶄綔锛夌殑鏋舵瀯锛屾瘮濡傝亰澶╂湇鍔″櫒锛屽苟鍙戝眬闄愪簬搴旂敤涓紝缂栫▼姣旇緝澶嶆潅锛孞DK1.4寮€濮嬫敮鎸併€

10銆佹湰鏂囧皬缁

鏈枃浠嬬粛浜嗕竴浜涘叧浜嶫avaBIO鍜孨IO浠庤嚜宸卞疄鎿嶇殑瑙掑害涓婄殑涓€浜涚悊瑙o紝鎴戜釜浜鸿涓鸿繖鏍峰幓鐞嗚ВBIO鍜孨IO浼氭瘮鍏夌湅姒傚康浼氭湁鏇存繁鐨勭悊瑙o紝涔熷笇鏈涘悇浣嶅悓瀛﹀彲浠ヨ嚜宸卞幓鏁蹭竴閬嶏紝閫氳繃绋嬪簭鐨勮繍琛岀粨鏋滃緱鍑鸿嚜宸卞JavaBIO鍜孨IO鐨勭悊瑙c€

闄勫綍锛氭洿澶歂IO銆佺綉缁滅紪绋嬫柟闈㈢殑璧勬枡

[1] NIO寮傛缃戠粶缂栫▼璧勬枡锛
Java鏂颁竴浠g綉缁滅紪绋嬫ā鍨婣IO鍘熺悊鍙奓inux绯荤粺AIO浠嬬粛
鏈夊叧鈥滀负浣曢€夋嫨Netty鈥濈殑11涓枒闂強瑙g瓟
寮€婧怤IO妗嗘灦鍏崷鈥斺€斿埌搴曟槸鍏堟湁MINA杩樻槸鍏堟湁Netty?
閫塏etty杩樻槸Mina锛氭繁鍏ョ爺绌朵笌瀵规瘮锛堜竴锛
閫塏etty杩樻槸Mina锛氭繁鍏ョ爺绌朵笌瀵规瘮锛堜簩锛
NIO妗嗘灦鍏ラ棬(涓€)锛氭湇鍔$鍩轰簬Netty4鐨刄DP鍙屽悜閫氫俊Demo婕旂ず
NIO妗嗘灦鍏ラ棬(浜)锛氭湇鍔$鍩轰簬MINA2鐨刄DP鍙屽悜閫氫俊Demo婕旂ず
NIO妗嗘灦鍏ラ棬(涓)锛歩OS涓嶮INA2銆丯etty4鐨勮法骞冲彴UDP鍙屽悜閫氫俊瀹炴垬
NIO妗嗘灦鍏ラ棬(鍥)锛欰ndroid涓嶮INA2銆丯etty4鐨勮法骞冲彴UDP鍙屽悜閫氫俊瀹炴垬
Netty 4.x瀛︿範锛堜竴锛夛細ByteBuf璇﹁В
Netty 4.x瀛︿範锛堜簩锛夛細Channel鍜孭ipeline璇﹁В
Netty 4.x瀛︿範锛堜笁锛夛細绾跨▼妯″瀷璇﹁В
Apache Mina妗嗘灦楂樼骇绡囷紙涓€锛夛細IoFilter璇﹁В
Apache Mina妗嗘灦楂樼骇绡囷紙浜岋級锛欼oHandler璇﹁В
MINA2 绾跨▼鍘熺悊鎬荤粨锛堝惈绠€鍗曟祴璇曞疄渚嬶級
Apache MINA2.0 寮€鍙戞寚鍗楋紙涓枃鐗堬級[闄勪欢涓嬭浇]
MINA銆丯etty鐨勬簮浠g爜锛堝湪绾块槄璇荤増锛夊凡鏁寸悊鍙戝竷
瑙e喅MINA鏁版嵁浼犺緭涓璗CP鐨勭矘鍖呫€佺己鍖呴棶棰橈紙鏈夋簮鐮侊級
瑙e喅Mina涓涓悓绫诲瀷Filter瀹炰緥鍏卞瓨鐨勯棶棰
瀹炶返鎬荤粨锛歂etty3.x鍗囩骇Netty4.x閬囧埌鐨勯偅浜涘潙锛堢嚎绋嬬瘒锛
瀹炶返鎬荤粨锛歂etty3.x VS Netty4.x鐨勭嚎绋嬫ā鍨
璇﹁ВNetty鐨勫畨鍏ㄦ€э細鍘熺悊浠嬬粛銆佷唬鐮佹紨绀猴紙涓婄瘒锛
璇﹁ВNetty鐨勫畨鍏ㄦ€э細鍘熺悊浠嬬粛銆佷唬鐮佹紨绀猴紙涓嬬瘒锛
璇﹁ВNetty鐨勪紭闆呴€€鍑烘満鍒跺拰鍘熺悊
NIO妗嗘灦璇﹁В锛歂etty鐨勯珮鎬ц兘涔嬮亾
Twitter锛氬浣曚娇鐢∟etty 4鏉ュ噺灏慗VM鐨凣C寮€閿€锛堣瘧鏂囷級
缁濆骞茶揣锛氬熀浜嶯etty瀹炵幇娴烽噺鎺ュ叆鐨勬帹閫佹湇鍔℃妧鏈鐐
Netty骞茶揣鍒嗕韩锛氫含涓滀含楹︾殑鐢熶骇绾CP缃戝叧鎶€鏈疄璺垫€荤粨
鏂版墜鍏ラ棬锛氱洰鍓嶄负姝㈡渶閫忓交鐨勭殑Netty楂樻€ц兘鍘熺悊鍜屾鏋舵灦鏋勮В鏋
鍐欑粰鍒濆鑰咃細Java楂樻€ц兘NIO妗嗘灦Netty鐨勫涔犳柟娉曞拰杩涢樁绛栫暐
灏戝暟鍡︼紒涓€鍒嗛挓甯︿綘璇绘噦Java鐨凬IO鍜岀粡鍏窱O鐨勫尯鍒
鍙蹭笂鏈€寮篔ava NIO鍏ラ棬锛氭媴蹇冧粠鍏ラ棬鍒版斁寮冪殑锛岃璇昏繖绡囷紒
鎵嬫妸鎵嬫暀浣犵敤Netty瀹炵幇缃戠粶閫氫俊绋嬪簭鐨勫績璺虫満鍒躲€佹柇绾块噸杩炴満鍒
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵鐢ㄤ唬鐮佸疄璺电粰浣犵湅锛屽啀涓嶆噦鎴戣浆琛岋紒
>> 鏇村鍚岀被鏂囩珷 鈥︹€

[2] 缃戠粶缂栫▼鍩虹璧勬枡锛
TCP/IP璇﹁В - 绗11绔犅稶DP锛氱敤鎴锋暟鎹姤鍗忚
TCP/IP璇﹁В - 绗17绔犅稵CP锛氫紶杈撴帶鍒跺崗璁
TCP/IP璇﹁В - 绗18绔犅稵CP杩炴帴鐨勫缓绔嬩笌缁堟
TCP/IP璇﹁В - 绗21绔犅稵CP鐨勮秴鏃朵笌閲嶄紶
鎶€鏈線浜嬶細鏀瑰彉涓栫晫鐨凾CP/IP鍗忚锛堢弽璐靛鍥俱€佹墜鏈烘厧鐐癸級
閫氫織鏄撴噦-娣卞叆鐞嗚ВTCP鍗忚锛堜笂锛夛細鐞嗚鍩虹
閫氫織鏄撴噦-娣卞叆鐞嗚ВTCP鍗忚锛堜笅锛夛細RTT銆佹粦鍔ㄧ獥鍙c€佹嫢濉炲鐞
鐞嗚缁忓吀锛歍CP鍗忚鐨3娆℃彙鎵嬩笌4娆℃尌鎵嬭繃绋嬭瑙
鐞嗚鑱旂郴瀹為檯锛歐ireshark鎶撳寘鍒嗘瀽TCP 3娆℃彙鎵嬨€4娆℃尌鎵嬭繃绋
璁$畻鏈虹綉缁滈€氳鍗忚鍏崇郴鍥撅紙涓枃鐝嶈棌鐗堬級
UDP涓竴涓寘鐨勫ぇ灏忔渶澶ц兘澶氬ぇ锛
P2P鎶€鏈瑙(涓€)锛歂AT璇﹁В鈥斺€旇缁嗗師鐞嗐€丳2P绠€浠
P2P鎶€鏈瑙(浜)锛歅2P涓殑NAT绌胯秺(鎵撴礊)鏂规璇﹁В
P2P鎶€鏈瑙(涓)锛歅2P鎶€鏈箣STUN銆乀URN銆両CE璇﹁В
閫氫織鏄撴噦锛氬揩閫熺悊瑙2P鎶€鏈腑鐨凬AT绌块€忓師鐞
楂樻€ц兘缃戠粶缂栫▼(涓€)锛氬崟鍙版湇鍔″櫒骞跺彂TCP杩炴帴鏁板埌搴曞彲浠ユ湁澶氬皯
楂樻€ц兘缃戠粶缂栫▼(浜)锛氫笂涓€涓10骞达紝钁楀悕鐨凜10K骞跺彂杩炴帴闂
楂樻€ц兘缃戠粶缂栫▼(涓)锛氫笅涓€涓10骞达紝鏄椂鍊欒€冭檻C10M骞跺彂闂浜
楂樻€ц兘缃戠粶缂栫▼(鍥)锛氫粠C10K鍒癈10M楂樻€ц兘缃戠粶搴旂敤鐨勭悊璁烘帰绱
楂樻€ц兘缃戠粶缂栫▼(浜)锛氫竴鏂囪鎳傞珮鎬ц兘缃戠粶缂栫▼涓殑I/O妯″瀷
楂樻€ц兘缃戠粶缂栫▼(鍏)锛氫竴鏂囪鎳傞珮鎬ц兘缃戠粶缂栫▼涓殑绾跨▼妯″瀷
Java鐨凚IO鍜孨IO寰堥毦鎳傦紵璺熺潃浠g爜绀轰緥锛岄噸鏂扮悊瑙e畠浠紒
涓嶄负浜虹煡鐨勭綉缁滅紪绋(涓€)锛氭祬鏋怲CP鍗忚涓殑鐤戦毦鏉傜棁(涓婄瘒)
涓嶄负浜虹煡鐨勭綉缁滅紪绋(浜)锛氭祬鏋怲CP鍗忚涓殑鐤戦毦鏉傜棁(涓嬬瘒)
涓嶄负浜虹煡鐨勭綉缁滅紪绋(涓)锛氬叧闂璗CP杩炴帴鏃朵负浠€涔堜細TIME_WAIT銆丆LOSE_WAIT
涓嶄负浜虹煡鐨勭綉缁滅紪绋(鍥)锛氭繁鍏ョ爺绌跺垎鏋怲CP鐨勫紓甯稿叧闂
涓嶄负浜虹煡鐨勭綉缁滅紪绋(浜)锛歎DP鐨勮繛鎺ユ€у拰璐熻浇鍧囪 
涓嶄负浜虹煡鐨勭綉缁滅紪绋(鍏)锛氭繁鍏ュ湴鐞嗚ВUDP鍗忚骞剁敤濂藉畠
涓嶄负浜虹煡鐨勭綉缁滅紪绋(涓)锛氬浣曡涓嶅彲闈犵殑UDP鍙樼殑鍙潬锛
涓嶄负浜虹煡鐨勭綉缁滅紪绋(鍏)锛氫粠鏁版嵁浼犺緭灞傛繁搴﹁В瀵咹TTP
涓嶄负浜虹煡鐨勭綉缁滅紪绋(涔)锛氱悊璁鸿仈绯诲疄闄咃紝鍏ㄦ柟浣嶆繁鍏ョ悊瑙NS
缃戠粶缂栫▼鎳掍汉鍏ラ棬(涓€)锛氬揩閫熺悊瑙g綉缁滈€氫俊鍗忚锛堜笂绡囷級
缃戠粶缂栫▼鎳掍汉鍏ラ棬(浜)锛氬揩閫熺悊瑙g綉缁滈€氫俊鍗忚锛堜笅绡囷級
缃戠粶缂栫▼鎳掍汉鍏ラ棬(涓)锛氬揩閫熺悊瑙CP鍗忚涓€绡囧氨澶
缃戠粶缂栫▼鎳掍汉鍏ラ棬(鍥)锛氬揩閫熺悊瑙CP鍜孶DP鐨勫樊寮
缃戠粶缂栫▼鎳掍汉鍏ラ棬(浜)锛氬揩閫熺悊瑙d负浠€涔堣UDP鏈夋椂姣擳CP鏇存湁浼樺娍
缃戠粶缂栫▼鎳掍汉鍏ラ棬(鍏)锛氬彶涓婃渶閫氫織鐨勯泦绾垮櫒銆佷氦鎹㈡満銆佽矾鐢卞櫒鍔熻兘鍘熺悊鍏ラ棬
缃戠粶缂栫▼鎳掍汉鍏ラ棬(涓)锛氭繁鍏ユ祬鍑猴紝鍏ㄩ潰鐞嗚ВHTTP鍗忚
缃戠粶缂栫▼鎳掍汉鍏ラ棬(鍏)锛氭墜鎶婃墜鏁欎綘鍐欏熀浜嶵CP鐨凷ocket闀胯繛鎺
缃戠粶缂栫▼鎳掍汉鍏ラ棬(涔)锛氶€氫織璁茶В锛屾湁浜咺P鍦板潃锛屼负浣曡繕瑕佺敤MAC鍦板潃锛
缃戠粶缂栫▼鎳掍汉鍏ラ棬(鍗)锛氫竴娉″翱鐨勬椂闂达紝蹇€熻鎳俀UIC鍗忚
鎶€鏈壂鐩诧細鏂颁竴浠e熀浜嶶DP鐨勪綆寤舵椂缃戠粶浼犺緭灞傚崗璁€斺€擰UIC璇﹁В
璁╀簰鑱旂綉鏇村揩锛氭柊涓€浠UIC鍗忚鍦ㄨ吘璁殑鎶€鏈疄璺靛垎浜
鐜颁唬绉诲姩绔綉缁滅煭杩炴帴鐨勪紭鍖栨墜娈垫€荤粨锛氳姹傞€熷害銆佸急缃戦€傚簲銆佸畨鍏ㄤ繚闅
鑱婅亰iOS涓綉缁滅紪绋嬮暱杩炴帴鐨勯偅浜涗簨
绉诲姩绔疘M寮€鍙戣€呭繀璇(涓€)锛氶€氫織鏄撴噦锛岀悊瑙gЩ鍔ㄧ綉缁滅殑鈥滃急鈥濆拰鈥滄參鈥
绉诲姩绔疘M寮€鍙戣€呭繀璇(浜)锛氬彶涓婃渶鍏ㄧЩ鍔ㄥ急缃戠粶浼樺寲鏂规硶鎬荤粨
IPv6鎶€鏈瑙o細鍩烘湰姒傚康銆佸簲鐢ㄧ幇鐘躲€佹妧鏈疄璺碉紙涓婄瘒锛
IPv6鎶€鏈瑙o細鍩烘湰姒傚康銆佸簲鐢ㄧ幇鐘躲€佹妧鏈疄璺碉紙涓嬬瘒锛
浠嶩TTP/0.9鍒癏TTP/2锛氫竴鏂囪鎳侶TTP鍗忚鐨勫巻鍙叉紨鍙樺拰璁捐鎬濊矾
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(涓€)锛氳窡鐫€鍔ㄧ敾鏉ュTCP涓夋鎻℃墜鍜屽洓娆℃尌鎵
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(浜)锛氭垜浠湪璇诲啓Socket鏃讹紝绌剁珶鍦ㄨ鍐欎粈涔堬紵
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(涓)锛欻TTP鍗忚蹇呯煡蹇呬細鐨勪竴浜涚煡璇
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(鍥)锛氬揩閫熺悊瑙TTP/2鐨勬湇鍔″櫒鎺ㄩ€(Server Push)
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(浜)锛氭瘡澶╅兘鍦ㄧ敤鐨凱ing鍛戒护锛屽畠鍒板簳鏄粈涔堬紵
鑴戞畫寮忕綉缁滅紪绋嬪叆闂(鍏)锛氫粈涔堟槸鍏綉IP鍜屽唴缃慖P锛烴AT杞崲鍙堟槸浠€涔堥锛
浠ョ綉娓告湇鍔$鐨勭綉缁滄帴鍏ュ眰璁捐涓轰緥锛岀悊瑙e疄鏃堕€氫俊鐨勬妧鏈寫鎴
杩堝悜楂橀樁锛氫紭绉€Android绋嬪簭鍛樺繀鐭ュ繀浼氱殑缃戠粶鍩虹
鍏ㄩ潰浜嗚В绉诲姩绔疍NS鍩熷悕鍔寔绛夋潅鐥囷細鎶€鏈師鐞嗐€侀棶棰樻牴婧愩€佽В鍐虫柟妗堢瓑
缇庡浘App鐨勭Щ鍔ㄧDNS浼樺寲瀹炶返锛欻TTPS璇锋眰鑰楁椂鍑忓皬杩戝崐
Android绋嬪簭鍛樺繀鐭ュ繀浼氱殑缃戠粶閫氫俊浼犺緭灞傚崗璁€斺€擴DP鍜孴CP
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(涓€)锛氶€氫俊浜ゆ崲鎶€鏈殑鐧惧勾鍙戝睍鍙(涓)
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(浜)锛氶€氫俊浜ゆ崲鎶€鏈殑鐧惧勾鍙戝睍鍙(涓)
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(涓)锛氬浗浜洪€氫俊鏂瑰紡鐨勭櫨骞村彉杩
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍥)锛氭墜鏈虹殑婕旇繘锛屽彶涓婃渶鍏ㄧЩ鍔ㄧ粓绔彂灞曞彶
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(浜)锛1G鍒5G锛30骞寸Щ鍔ㄩ€氫俊鎶€鏈紨杩涘彶
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍏)锛氱Щ鍔ㄧ粓绔殑鎺ュご浜衡€斺€斺€滃熀绔欌€濇妧鏈
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(涓)锛氱Щ鍔ㄧ粓绔殑鍗冮噷椹€斺€斺€滅數纾佹尝鈥
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍏)锛氶浂鍩虹锛屽彶涓婃渶寮衡€滃ぉ绾库€濆師鐞嗘壂鐩
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(涔)锛氭棤绾块€氫俊缃戠粶鐨勪腑鏋⑩€斺€斺€滄牳蹇冪綉鈥
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗)锛氶浂鍩虹锛屽彶涓婃渶寮5G鎶€鏈壂鐩
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗佷竴)锛氫负浠€涔圵iFi淇″彿宸紵涓€鏂囧嵆鎳傦紒
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗佷簩)锛氫笂缃戝崱椤匡紵缃戠粶鎺夌嚎锛熶竴鏂囧嵆鎳傦紒
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗佷笁)锛氫负浠€涔堟墜鏈轰俊鍙峰樊锛熶竴鏂囧嵆鎳傦紒
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗佸洓)锛氶珮閾佷笂鏃犵嚎涓婄綉鏈夊闅撅紵涓€鏂囧嵆鎳傦紒
IM寮€鍙戣€呯殑闆跺熀纭€閫氫俊鎶€鏈叆闂(鍗佷簲)锛氱悊瑙e畾浣嶆妧鏈紝涓€绡囧氨澶
鐧惧害APP绉诲姩绔綉缁滄繁搴︿紭鍖栧疄璺靛垎浜(涓€)锛欴NS浼樺寲绡
鐧惧害APP绉诲姩绔綉缁滄繁搴︿紭鍖栧疄璺靛垎浜(浜)锛氱綉缁滆繛鎺ヤ紭鍖栫瘒
鐧惧害APP绉诲姩绔綉缁滄繁搴︿紭鍖栧疄璺靛垎浜(涓)锛氱Щ鍔ㄧ寮辩綉浼樺寲绡
鎶€鏈ぇ鐗涢檲纭曠殑鍒嗕韩锛氱敱娴呭叆娣憋紝缃戠粶缂栫▼瀛︿範缁忛獙骞茶揣鎬荤粨
鍙兘浼氭悶鐮镐綘鐨勯潰璇曪細浣犵煡閬撲竴涓猅CP杩炴帴涓婅兘鍙戣捣澶氬皯涓狧TTP璇锋眰鍚楋紵
鐭ヤ箮鎶€鏈垎浜細鐭ヤ箮鍗冧竾绾у苟鍙戠殑楂樻€ц兘闀胯繛鎺ョ綉鍏虫妧鏈疄璺
>> 鏇村鍚岀被鏂囩珷 鈥︹€

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK