缃戠粶缂栫▼

鍐呭棰勮

  • 杞欢鏋舵瀯CS锛廈S
  • 缃戠粶閫氫俊涓夎绱�
  • TCP閫氫俊
  • Socket濂楁帴瀛�
  • ServerSocket

缃戠粶缂栫▼鍏ラ棬

1.1杞欢缁撴瀯

  • C/S缁撴瀯 锛氬叏绉颁负Client/Server缁撴瀯锛屾槸鎸囧鎴风鍜屾湇鍔″櫒缁撴瀯銆傚父瑙佺▼搴忔湁锛憋急銆佽繀闆风瓑杞欢銆�

B/S缁撴瀯 锛氬叏绉颁负Browser/Server缁撴瀯锛屾槸鎸囨祻瑙堝櫒鍜屾湇鍔″櫒缁撴瀯銆傚父瑙佹祻瑙堝櫒鏈夎胺姝屻�佺伀鐙愮瓑銆�

涓ょ鏋舵瀯鍚勬湁浼樺娍锛屼絾鏄棤璁哄摢绉嶆灦鏋勶紝閮界涓嶅紑缃戠粶鐨勬敮鎸併��缃戠粶缂栫▼锛屽氨鏄湪涓�瀹氱殑鍗忚涓嬶紝瀹炵幇涓ゅ彴璁$畻鏈虹殑閫氫俊鐨勭▼搴忋��

1.2 缃戠粶閫氫俊鍗忚

  • 缃戠粶閫氫俊鍗忚锛�閫氳繃璁$畻鏈虹綉缁滃彲浠ヤ娇澶氬彴璁$畻鏈哄疄鐜拌繛鎺ワ紝浣嶄簬鍚屼竴涓綉缁滀腑鐨勮绠楁満鍦ㄨ繘琛岃繛鎺ュ拰閫氫俊鏃堕渶瑕侀伒瀹堜竴瀹氱殑瑙勫垯锛岃繖灏卞ソ姣斿湪閬撹矾涓椹剁殑姹借溅涓�瀹氳閬靛畧浜ら�氳鍒欎竴鏍枫�傚湪璁$畻鏈虹綉缁滀腑锛岃繖浜涜繛鎺ュ拰閫氫俊鐨勮鍒欒绉颁负缃戠粶閫氫俊鍗忚锛屽畠瀵规暟鎹殑浼犺緭鏍煎紡銆佷紶杈撻�熺巼銆佷紶杈撴楠ょ瓑鍋氫簡缁熶竴瑙勫畾锛岄�氫俊鍙屾柟蹇呴』鍚屾椂閬靛畧鎵嶈兘瀹屾垚鏁版嵁浜ゆ崲銆�
  • TCP/IP鍗忚锛� 浼犺緭鎺у埗鍗忚/鍥犵壒缃戜簰鑱斿崗璁�( Transmission Control Protocol/Internet Protocol)锛屾槸Internet鏈�鍩烘湰銆佹渶骞挎硾鐨勫崗璁�傚畠瀹氫箟浜嗚绠楁満濡備綍杩炲叆鍥犵壒缃戯紝浠ュ強鏁版嵁濡備綍鍦ㄥ畠浠箣闂翠紶杈撶殑鏍囧噯銆傚畠鐨勫唴閮ㄥ寘鍚竴绯诲垪鐨勭敤浜庡鐞嗘暟鎹�氫俊鐨勫崗璁紝骞堕噰鐢ㄤ簡4灞傜殑鍒嗗眰妯″瀷锛屾瘡涓�灞傞兘鍛煎彨瀹冪殑涓嬩竴灞傛墍鎻愪緵鐨勫崗璁潵瀹屾垚鑷繁鐨勯渶姹傘��

涓婂浘涓紝TCP/IP鍗忚涓殑鍥涘眰鍒嗗埆鏄簲鐢ㄥ眰銆佷紶杈撳眰銆佺綉缁滃眰鍜岄摼璺眰锛屾瘡灞傚垎鍒礋璐d笉鍚岀殑閫氫俊鍔熻兘銆�
閾捐矾灞傦細閾捐矾灞傛槸鐢ㄤ簬瀹氫箟鐗╃悊浼犺緭閫氶亾锛岄�氬父鏄鏌愪簺缃戠粶杩炴帴璁惧鐨勯┍鍔ㄥ崗璁紝渚嬪閽堝鍏夌氦銆佺綉绾挎彁渚涚殑椹卞姩銆�
缃戠粶灞傦細缃戠粶灞傛槸鏁翠釜TCP/IP鍗忚鐨勬牳蹇冿紝瀹冧富瑕佺敤浜庡皢浼犺緭鐨勬暟鎹繘琛屽垎缁勶紝灏嗗垎缁勬暟鎹彂閫佸埌鐩爣璁$畻鏈烘垨鑰呯綉缁溿��
杩愯緭灞傦細涓昏浣跨綉缁滅▼搴忚繘琛岄�氫俊锛屽湪杩涜缃戠粶閫氫俊鏃讹紝鍙互閲囩敤TCP鍗忚锛屼篃鍙互閲囩敤UDP鍗忚銆�
搴旂敤灞傦細涓昏璐熻矗搴旂敤绋嬪簭鐨勫崗璁紝渚嬪HTTP鍗忚銆丗TP鍗忚绛夈��

1.3 鍗忚鍒嗙被

閫氫俊鐨勫崗璁繕鏄瘮杈冨鏉傜殑锛�java.net 鍖呬腑鍖呭惈鐨勭被鍜屾帴鍙o紝瀹冧滑鎻愪緵浣庡眰娆$殑閫氫俊缁嗚妭銆傛垜浠彲浠ョ洿鎺ヤ娇鐢ㄨ繖浜涚被鍜屾帴鍙o紝鏉ヤ笓娉ㄤ簬缃戠粶绋嬪簭寮�鍙戯紝鑰屼笉鐢ㄨ�冭檻閫氫俊鐨勭粏鑺傘��

java.net 鍖呬腑鎻愪緵浜嗕袱绉嶅父瑙佺殑缃戠粶鍗忚鐨勬敮鎸侊細

  • UDP锛氱敤鎴锋暟鎹姤鍗忚(User Datagram Protocol)銆俇DP鏄棤杩炴帴閫氫俊鍗忚锛屽嵆鍦ㄦ暟鎹紶杈撴椂锛屾暟鎹殑鍙戦�佺鍜屾帴鏀剁涓嶅缓绔嬮�昏緫杩炴帴銆傜畝鍗曟潵璇达紝褰撲竴鍙拌绠楁満鍚戝彟澶栦竴鍙拌绠楁満鍙戦�佹暟鎹椂锛屽彂閫佺涓嶄細纭鎺ユ敹绔槸鍚﹀瓨鍦紝灏变細鍙戝嚭鏁版嵁锛屽悓鏍锋帴鏀剁鍦ㄦ敹鍒版暟鎹椂锛屼篃涓嶄細鍚戝彂閫佺鍙嶉鏄惁鏀跺埌鏁版嵁銆�

    鐢变簬浣跨敤UDP鍗忚娑堣�楄祫婧愬皬锛岄�氫俊鏁堢巼楂橈紝鎵�浠ラ�氬父閮戒細鐢ㄤ簬闊抽銆佽棰戝拰鏅�氭暟鎹殑浼犺緭渚嬪瑙嗛浼氳閮戒娇鐢║DP鍗忚锛屽洜涓鸿繖绉嶆儏鍐靛嵆浣垮伓灏斾涪澶变竴涓や釜鏁版嵁鍖咃紝涔熶笉浼氬鎺ユ敹缁撴灉浜х敓澶ぇ褰卞搷銆�

    浣嗘槸鍦ㄤ娇鐢║DP鍗忚浼犻�佹暟鎹椂锛岀敱浜嶶DP鐨勯潰鍚戞棤杩炴帴鎬э紝涓嶈兘淇濊瘉鏁版嵁鐨勫畬鏁存�э紝鍥犳鍦ㄤ紶杈撻噸瑕佹暟鎹椂涓嶅缓璁娇鐢║DP鍗忚銆俇DP鐨勪氦鎹㈣繃绋嬪涓嬪浘鎵�绀恒��

UDP閫氫俊鍥捐В.png

鐗圭偣:鏁版嵁琚檺鍒跺湪64kb浠ュ唴锛岃秴鍑鸿繖涓寖鍥村氨涓嶈兘鍙戦�佷簡銆�

鏁版嵁鎶�(Datagram):缃戠粶浼犺緭鐨勫熀鏈崟浣�

  • TCP锛氫紶杈撴帶鍒跺崗璁� (Transmission Control Protocol)銆俆CP鍗忚鏄�闈㈠悜杩炴帴鐨勯�氫俊鍗忚锛屽嵆浼犺緭鏁版嵁涔嬪墠锛屽湪鍙戦�佺鍜屾帴鏀剁寤虹珛閫昏緫杩炴帴锛岀劧鍚庡啀浼犺緭鏁版嵁锛屽畠鎻愪緵浜嗕袱鍙拌绠楁満涔嬮棿鍙潬鏃犲樊閿欑殑鏁版嵁浼犺緭銆�

    鍦═CP杩炴帴涓繀椤昏鏄庣‘瀹㈡埛绔笌鏈嶅姟鍣ㄧ锛岀敱瀹㈡埛绔悜鏈嶅姟绔彂鍑鸿繛鎺ヨ姹傦紝姣忔杩炴帴鐨勫垱寤洪兘闇�瑕佺粡杩団�滀笁娆℃彙鎵嬧�濄��

    • 涓夋鎻℃墜锛歍CP鍗忚涓紝鍦ㄥ彂閫佹暟鎹殑鍑嗗闃舵锛屽鎴风涓庢湇鍔″櫒涔嬮棿鐨勪笁娆′氦浜掞紝浠ヤ繚璇佽繛鎺ョ殑鍙潬銆�
      • 绗竴娆℃彙鎵嬶紝瀹㈡埛绔悜鏈嶅姟鍣ㄧ鍙戝嚭杩炴帴璇锋眰锛岀瓑寰呮湇鍔″櫒纭銆�
      • 绗簩娆℃彙鎵嬶紝鏈嶅姟鍣ㄧ鍚戝鎴风鍥為�佷竴涓搷搴旓紝閫氱煡瀹㈡埛绔敹鍒颁簡杩炴帴璇锋眰銆�
      • 绗笁娆℃彙鎵嬶紝瀹㈡埛绔啀娆″悜鏈嶅姟鍣ㄧ鍙戦�佺‘璁や俊鎭紝纭杩炴帴銆傛暣涓氦浜掕繃绋嬪涓嬪浘鎵�绀恒��

鈥� 瀹屾垚涓夋鎻℃墜锛岃繛鎺ュ缓绔嬪悗锛屽鎴风鍜屾湇鍔″櫒灏卞彲浠ュ紑濮嬭繘琛屾暟鎹紶杈撲簡銆傜敱浜庤繖绉嶉潰鍚戣繛鎺ョ殑鐗规�э紝TCP鍗忚鍙互淇濊瘉浼犺緭鏁版嵁鐨勫畨鍏紝鎵�浠ュ簲鐢ㄥ崄鍒嗗箍娉涳紝渚嬪涓嬭浇鏂囦欢銆佹祻瑙堢綉椤电瓑銆�

1.4 缃戠粶缂栫▼涓夎绱�

鍗忚

  • 鍗忚锛�璁$畻鏈虹綉缁滈�氫俊蹇呴』閬靛畧鐨勮鍒欙紝宸茬粡浠嬬粛杩囦簡锛屼笉鍐嶈禈杩般��

IP鍦板潃

  • IP鍦板潃锛氭寚浜掕仈缃戝崗璁湴鍧�锛圛nternet Protocol Address锛�锛屼織绉癐P銆侷P鍦板潃鐢ㄦ潵缁欎竴涓綉缁滀腑鐨勮绠楁満璁惧鍋氬敮涓�鐨勭紪鍙枫�傚亣濡傛垜浠妸鈥滀釜浜虹數鑴戔�濇瘮浣溾�滀竴鍙扮數璇濃�濈殑璇濓紝閭d箞鈥淚P鍦板潃鈥濆氨鐩稿綋浜庘�滅數璇濆彿鐮佲�濄��

IP鍦板潃鍒嗙被

  • IPv4锛氭槸涓�涓�32浣嶇殑浜岃繘鍒舵暟锛岄�氬父琚垎涓�4涓瓧鑺傦紝琛ㄧず鎴�a.b.c.d 鐨勫舰寮忥紝渚嬪192.168.65.100 銆傚叾涓璦銆乥銆乧銆乨閮芥槸0~255涔嬮棿鐨勫崄杩涘埗鏁存暟锛岄偅涔堟渶澶氬彲浠ヨ〃绀�42浜夸釜銆�

  • IPv6锛氱敱浜庝簰鑱旂綉鐨勮摤鍕冨彂灞曪紝IP鍦板潃鐨勯渶姹傞噺鎰堟潵鎰堝ぇ锛屼絾鏄綉缁滃湴鍧�璧勬簮鏈夐檺锛屼娇寰桰P鐨勫垎閰嶈秺鍙戠揣寮犮��

    涓轰簡鎵╁ぇ鍦板潃绌洪棿锛屾嫙閫氳繃IPv6閲嶆柊瀹氫箟鍦板潃绌洪棿锛岄噰鐢�128浣嶅湴鍧�闀垮害锛屾瘡16涓瓧鑺備竴缁勶紝鍒嗘垚8缁勫崄鍏繘鍒舵暟锛岃〃绀烘垚ABCD:EF01:2345:6789:ABCD:EF01:2345:6789锛屽彿绉板彲浠ヤ负鍏ㄤ笘鐣岀殑姣忎竴绮掓矙瀛愮紪涓婁竴涓綉鍧�锛岃繖鏍峰氨瑙e喅浜嗙綉缁滃湴鍧�璧勬簮鏁伴噺涓嶅鐨勯棶棰樸��

甯哥敤鍛戒护

  • 鏌ョ湅鏈満IP鍦板潃锛屽湪鎺у埗鍙拌緭鍏ワ細
ipconfig
  • 妫�鏌ョ綉缁滄槸鍚﹁繛閫氾紝鍦ㄦ帶鍒跺彴杈撳叆锛�
ping 绌烘牸 IP鍦板潃
ping 220.181.57.216

鐗规畩鐨処P鍦板潃

  • 鏈満IP鍦板潃锛�127.0.0.1銆�localhost 銆�

绔彛鍙�

缃戠粶鐨勯�氫俊锛屾湰璐ㄤ笂鏄袱涓繘绋嬶紙搴旂敤绋嬪簭锛夌殑閫氫俊銆傛瘡鍙拌绠楁満閮芥湁寰堝鐨勮繘绋嬶紝閭d箞鍦ㄧ綉缁滈�氫俊鏃讹紝濡備綍鍖哄垎杩欎簺杩涚▼鍛紵

濡傛灉璇�IP鍦板潃鍙互鍞竴鏍囪瘑缃戠粶涓殑璁惧锛岄偅涔�绔彛鍙�灏卞彲浠ュ敮涓�鏍囪瘑璁惧涓殑杩涚▼锛堝簲鐢ㄧ▼搴忥級浜嗐��

  • 绔彛鍙凤細鐢ㄤ袱涓瓧鑺傝〃绀虹殑鏁存暟锛屽畠鐨勫彇鍊艰寖鍥存槸0~65535銆傚叾涓紝0~1023涔嬮棿鐨勭鍙e彿鐢ㄤ簬涓�浜涚煡鍚嶇殑缃戠粶鏈嶅姟鍜屽簲鐢紝鏅�氱殑搴旂敤绋嬪簭闇�瑕佷娇鐢�1024浠ヤ笂鐨勭鍙e彿銆傚鏋滅鍙e彿琚彟澶栦竴涓湇鍔℃垨搴旂敤鎵�鍗犵敤锛屼細瀵艰嚧褰撳墠绋嬪簭鍚姩澶辫触銆�

鍒╃敤鍗忚+IP鍦板潃+绔彛鍙� 涓夊厓缁勫悎锛屽氨鍙互鏍囪瘑缃戠粶涓殑杩涚▼浜嗭紝閭d箞杩涚▼闂寸殑閫氫俊灏卞彲浠ュ埄鐢ㄨ繖涓爣璇嗕笌鍏跺畠杩涚▼杩涜浜や簰銆�


TCP閫氫俊绋嬪簭

2.1 姒傝堪

TCP閫氫俊鑳藉疄鐜颁袱鍙拌绠楁満涔嬮棿鐨勬暟鎹氦浜掞紝閫氫俊鐨勪袱绔紝瑕佷弗鏍煎尯鍒嗕负瀹㈡埛绔紙Client锛変笌鏈嶅姟绔紙Server锛夈��

涓ょ閫氫俊鏃舵楠わ細

  1. 鏈嶅姟绔▼搴忥紝闇�瑕佷簨鍏堝惎鍔紝绛夊緟瀹㈡埛绔殑杩炴帴銆�
  2. 瀹㈡埛绔富鍔ㄨ繛鎺ユ湇鍔″櫒绔紝杩炴帴鎴愬姛鎵嶈兘閫氫俊銆傛湇鍔$涓嶅彲浠ヤ富鍔ㄨ繛鎺ュ鎴风銆�

鍦↗ava涓紝鎻愪緵浜嗕袱涓被鐢ㄤ簬瀹炵幇TCP閫氫俊绋嬪簭锛�

  1. 瀹㈡埛绔細java.net.Socket 绫昏〃绀恒�傚垱寤�Socket瀵硅薄锛屽悜鏈嶅姟绔彂鍑鸿繛鎺ヨ姹傦紝鏈嶅姟绔搷搴旇姹傦紝涓よ�呭缓绔嬭繛鎺ュ紑濮嬮�氫俊銆�
  2. 鏈嶅姟绔細java.net.ServerSocket 绫昏〃绀恒�傚垱寤�ServerSocket瀵硅薄锛岀浉褰撲簬寮�鍚竴涓湇鍔★紝骞剁瓑寰呭鎴风鐨勮繛鎺ャ��

2.2 Socket绫�

Socket 绫伙細璇ョ被瀹炵幇瀹㈡埛绔鎺ュ瓧锛屽鎺ュ瓧鎸囩殑鏄袱鍙拌澶囦箣闂撮�氳鐨勭鐐广��

鏋勯�犳柟娉�

  • public Socket(String host, int port) :鍒涘缓濂楁帴瀛楀璞″苟灏嗗叾杩炴帴鍒版寚瀹氫富鏈轰笂鐨勬寚瀹氱鍙e彿銆傚鏋滄寚瀹氱殑host鏄痭ull 锛屽垯鐩稿綋浜庢寚瀹氬湴鍧�涓哄洖閫佸湴鍧�銆�

    鍥為�佸湴鍧�(127.x.x.x) 鏄湰鏈哄洖閫佸湴鍧�锛圠oopback Address锛夛紝涓昏鐢ㄤ簬缃戠粶杞欢娴嬭瘯浠ュ強鏈湴鏈鸿繘绋嬮棿閫氫俊锛屾棤璁轰粈涔堢▼搴忥紝涓�鏃︿娇鐢ㄥ洖閫佸湴鍧�鍙戦�佹暟鎹紝绔嬪嵆杩斿洖锛屼笉杩涜浠讳綍缃戠粶浼犺緭銆�

鏋勯�犱妇渚嬶紝浠g爜濡備笅锛�

Socket client = new Socket("127.0.0.1", 6666);

鎴愬憳鏂规硶

  • public InputStream getInputStream() 锛� 杩斿洖姝ゅ鎺ュ瓧鐨勮緭鍏ユ祦銆�

    • 濡傛灉姝coket鍏锋湁鐩稿叧鑱旂殑閫氶亾锛屽垯鐢熸垚鐨処nputStream 鐨勬墍鏈夋搷浣滀篃鍏宠仈璇ラ�氶亾銆�
    • 鍏抽棴鐢熸垚鐨処nputStream涔熷皢鍏抽棴鐩稿叧鐨凷ocket銆�
  • public OutputStream getOutputStream() 锛� 杩斿洖姝ゅ鎺ュ瓧鐨勮緭鍑烘祦銆�

    • 濡傛灉姝coket鍏锋湁鐩稿叧鑱旂殑閫氶亾锛屽垯鐢熸垚鐨凮utputStream 鐨勬墍鏈夋搷浣滀篃鍏宠仈璇ラ�氶亾銆�
    • 鍏抽棴鐢熸垚鐨凮utputStream涔熷皢鍏抽棴鐩稿叧鐨凷ocket銆�
  • public void close() 锛氬叧闂濂楁帴瀛椼��

    • 涓�鏃︿竴涓猻ocket琚叧闂紝瀹冧笉鍙啀浣跨敤銆�
    • 鍏抽棴姝ocket涔熷皢鍏抽棴鐩稿叧鐨処nputStream鍜孫utputStream 銆�
  • public void shutdownOutput() 锛� 绂佺敤姝ゅ鎺ュ瓧鐨勮緭鍑烘祦銆�

    • 浠讳綍鍏堝墠鍐欏嚭鐨勬暟鎹皢琚彂閫侊紝闅忓悗缁堟杈撳嚭娴併��

    2.3 ServerSocket绫�

ServerSocket绫伙細杩欎釜绫诲疄鐜颁簡鏈嶅姟鍣ㄥ鎺ュ瓧锛岃瀵硅薄绛夊緟閫氳繃缃戠粶鐨勮姹傘��

鏋勯�犳柟娉�

  • public ServerSocket(int port) 锛氫娇鐢ㄨ鏋勯�犳柟娉曞湪鍒涘缓ServerSocket瀵硅薄鏃讹紝灏卞彲浠ュ皢鍏剁粦瀹氬埌涓�涓寚瀹氱殑绔彛鍙蜂笂锛屽弬鏁皃ort灏辨槸绔彛鍙枫��

鏋勯�犱妇渚嬶紝浠g爜濡備笅锛�

ServerSocket server = new ServerSocket(6666);

鎴愬憳鏂规硶

  • public Socket accept() 锛氫睛鍚苟鎺ュ彈杩炴帴锛岃繑鍥炰竴涓柊鐨凷ocket瀵硅薄锛岀敤浜庡拰瀹㈡埛绔疄鐜伴�氫俊銆傝鏂规硶浼氫竴鐩撮樆濉炵洿鍒板缓绔嬭繛鎺ャ��

2.4 绠�鍗曠殑TCP缃戠粶绋嬪簭

TCP閫氫俊鍒嗘瀽鍥捐В

  1. 銆愭湇鍔$銆戝惎鍔�,鍒涘缓ServerSocket瀵硅薄锛岀瓑寰呰繛鎺ャ��
  2. 銆愬鎴风銆戝惎鍔�,鍒涘缓Socket瀵硅薄锛岃姹傝繛鎺ャ��
  3. 銆愭湇鍔$銆戞帴鏀惰繛鎺�,璋冪敤accept鏂规硶锛屽苟杩斿洖涓�涓猄ocket瀵硅薄銆�
  4. 銆愬鎴风銆慡ocket瀵硅薄锛岃幏鍙朞utputStream锛屽悜鏈嶅姟绔啓鍑烘暟鎹��
  5. 銆愭湇鍔$銆慡coket瀵硅薄锛岃幏鍙朓nputStream锛岃鍙栧鎴风鍙戦�佺殑鏁版嵁銆�

鍒版锛屽鎴风鍚戞湇鍔$鍙戦�佹暟鎹垚鍔熴��

鑷锛屾湇鍔$鍚戝鎴风鍥炲啓鏁版嵁銆�

  1. 銆愭湇鍔$銆慡ocket瀵硅薄锛岃幏鍙朞utputStream锛屽悜瀹㈡埛绔洖鍐欐暟鎹��
  2. 銆愬鎴风銆慡coket瀵硅薄锛岃幏鍙朓nputStream锛岃В鏋愬洖鍐欐暟鎹��
  3. 銆愬鎴风銆戦噴鏀捐祫婧愶紝鏂紑杩炴帴銆�

瀹㈡埛绔悜鏈嶅姟鍣ㄥ彂閫佹暟鎹�

鏈嶅姟绔疄鐜帮細

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟绔惎鍔� , 绛夊緟杩炴帴 .... ");
        // 1.鍒涘缓 ServerSocket瀵硅薄锛岀粦瀹氱鍙o紝寮�濮嬬瓑寰呰繛鎺�
        ServerSocket ss = new ServerSocket(6666);
        // 2.鎺ユ敹杩炴帴 accept 鏂规硶, 杩斿洖 socket 瀵硅薄.
        Socket server = ss.accept();
        // 3.閫氳繃socket 鑾峰彇杈撳叆娴�
        InputStream is = server.getInputStream();
        // 4.涓�娆℃�ц鍙栨暟鎹�
        // 4.1 鍒涘缓瀛楄妭鏁扮粍
        byte[] b = new byte[1024];
        // 4.2 鎹鍙栧埌瀛楄妭鏁扮粍涓�.
        int len = is.read(b)锛�
        // 4.3 瑙f瀽鏁扮粍,鎵撳嵃瀛楃涓蹭俊鎭�
        String msg = new String(b, 0, len);
        System.out.println(msg);
        //5.鍏抽棴璧勬簮.
        is.close();
        server.close();
    }
}

瀹㈡埛绔疄鐜帮細

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("瀹㈡埛绔� 鍙戦�佹暟鎹�");
        // 1.鍒涘缓 Socket ( ip , port ) , 纭畾杩炴帴鍒板摢閲�.
        Socket client = new Socket("localhost", 6666);
        // 2.鑾峰彇娴佸璞� . 杈撳嚭娴�
        OutputStream os = client.getOutputStream();
        // 3.鍐欏嚭鏁版嵁.
        os.write("浣犲ソ涔�? tcp ,鎴戞潵浜�".getBytes());
        // 4. 鍏抽棴璧勬簮 .
        os.close();
        client.close();
    }
}

鏈嶅姟鍣ㄥ悜瀹㈡埛绔洖鍐欐暟鎹�

鏈嶅姟绔疄鐜帮細

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟绔惎鍔� , 绛夊緟杩炴帴 .... ");
        // 1.鍒涘缓 ServerSocket瀵硅薄锛岀粦瀹氱鍙o紝寮�濮嬬瓑寰呰繛鎺�
        ServerSocket ss = new ServerSocket(6666);
        // 2.鎺ユ敹杩炴帴 accept 鏂规硶, 杩斿洖 socket 瀵硅薄.
        Socket server = ss.accept();
        // 3.閫氳繃socket 鑾峰彇杈撳叆娴�
        InputStream is = server.getInputStream();
        // 4.涓�娆℃�ц鍙栨暟鎹�
        // 4.1 鍒涘缓瀛楄妭鏁扮粍
        byte[] b = new byte[1024];
        // 4.2 鎹鍙栧埌瀛楄妭鏁扮粍涓�.
        int len = is.read(b)锛�
        // 4.3 瑙f瀽鏁扮粍,鎵撳嵃瀛楃涓蹭俊鎭�
        String msg = new String(b, 0, len);
        System.out.println(msg);
        // =================鍥炲啓鏁版嵁=======================
        // 5. 閫氳繃 socket 鑾峰彇杈撳嚭娴�
         OutputStream out = server.getOutputStream();
        // 6. 鍥炲啓鏁版嵁
         out.write("鎴戝緢濂�,璋㈣阿浣�".getBytes());
        // 7.鍏抽棴璧勬簮.
        out.close();
        is.close();
        server.close();
    }
}

瀹㈡埛绔疄鐜帮細

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("瀹㈡埛绔� 鍙戦�佹暟鎹�");
        // 1.鍒涘缓 Socket ( ip , port ) , 纭畾杩炴帴鍒板摢閲�.
        Socket client = new Socket("localhost", 6666);
        // 2.閫氳繃Scoket,鑾峰彇杈撳嚭娴佸璞� 
        OutputStream os = client.getOutputStream();
        // 3.鍐欏嚭鏁版嵁.
        os.write("浣犲ソ涔�? tcp ,鎴戞潵浜�".getBytes());
        // ==============瑙f瀽鍥炲啓=========================
        // 4. 閫氳繃Scoket,鑾峰彇 杈撳叆娴佸璞�
        InputStream in = client.getInputStream();
        // 5. 璇诲彇鏁版嵁鏁版嵁
        byte[] b = new byte[100];
        int len = in.read(b);
        System.out.println(new String(b, 0, len));
        // 6. 鍏抽棴璧勬簮 .
        in.close();
        os.close();
        client.close();
    }
}

缁煎悎妗堜緥

3.1 鏂囦欢涓婁紶妗堜緥

鏂囦欢涓婁紶鍒嗘瀽鍥捐В

鏂囦欢涓婁紶鐨勫師鐞�.png
  1. 銆愬鎴风銆戣緭鍏ユ祦锛屼粠纭洏璇诲彇鏂囦欢鏁版嵁鍒扮▼搴忎腑銆�
  2. 銆愬鎴风銆戣緭鍑烘祦锛屽啓鍑烘枃浠舵暟鎹埌鏈嶅姟绔��
  3. 銆愭湇鍔$銆戣緭鍏ユ祦锛岃鍙栨枃浠舵暟鎹埌鏈嶅姟绔▼搴忋��
  4. 銆愭湇鍔$銆戣緭鍑烘祦锛屽啓鍑烘枃浠舵暟鎹埌鏈嶅姟鍣ㄧ‖鐩樹腑銆�

鍩烘湰瀹炵幇

鏈嶅姟绔疄鐜帮細

public class FileUpload_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟鍣� 鍚姩.....  ");
        // 1. 鍒涘缓鏈嶅姟绔疭erverSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        // 2. 寤虹珛杩炴帴 
        Socket accept = serverSocket.accept();
        // 3. 鍒涘缓娴佸璞�
        // 3.1 鑾峰彇杈撳叆娴�,璇诲彇鏂囦欢鏁版嵁
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
        // 3.2 鍒涘缓杈撳嚭娴�,淇濆瓨鍒版湰鍦� .
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.jpg"));
        // 4. 璇诲啓鏁版嵁
        byte[] b = new byte[1024 * 8];
        int len;
        while ((len = bis.read(b)) != -1) {
            bos.write(b, 0, len);
        }
        //5. 鍏抽棴 璧勬簮
        bos.close();
        bis.close();
        accept.close();
        System.out.println("鏂囦欢涓婁紶宸蹭繚瀛�");
    }
}

瀹㈡埛绔疄鐜帮細

public class FileUPload_Client {
    public static void main(String[] args) throws IOException {
        // 1.鍒涘缓娴佸璞�
        // 1.1 鍒涘缓杈撳叆娴�,璇诲彇鏈湴鏂囦欢  
        BufferedInputStream bis  = new BufferedInputStream(new FileInputStream("test.jpg"));
        // 1.2 鍒涘缓杈撳嚭娴�,鍐欏埌鏈嶅姟绔� 
        Socket socket = new Socket("localhost", 6666);
        BufferedOutputStream   bos   = new BufferedOutputStream(socket.getOutputStream());

        //2.鍐欏嚭鏁版嵁. 
        byte[] b  = new byte[1024 * 8 ];
        int len ; 
        while (( len  = bis.read(b))!=-1) {
            bos.write(b, 0, len);
            bos.flush();
        }
        System.out.println("鏂囦欢鍙戦�佸畬姣�");
        // 3.閲婃斁璧勬簮

        bos.close(); 
        socket.close();
        bis.close(); 
        System.out.println("鏂囦欢涓婁紶瀹屾瘯 ");
    }
}

鏂囦欢涓婁紶浼樺寲鍒嗘瀽

鏂囦欢涓婁紶妗堜緥鐨勯樆濉為棶棰�.png
  1. 鏂囦欢鍚嶇О鍐欐鐨勯棶棰�

    鏈嶅姟绔紝淇濆瓨鏂囦欢鐨勫悕绉板鏋滃啓姝伙紝閭d箞鏈�缁堝鑷存湇鍔″櫒纭洏锛屽彧浼氫繚鐣欎竴涓枃浠讹紝寤鸿浣跨敤绯荤粺鏃堕棿浼樺寲锛屼繚璇佹枃浠跺悕绉板敮涓�锛屼唬鐮佸涓嬶細

FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg") // 鏂囦欢鍚嶇О
BufferedOutputStream bos = new BufferedOutputStream(fis);
  1. 寰幆鎺ユ敹鐨勯棶棰�

    鏈嶅姟绔紝鎸囦繚瀛樹竴涓枃浠跺氨鍏抽棴浜嗭紝涔嬪悗鐨勭敤鎴锋棤娉曞啀涓婁紶锛岃繖鏄笉绗﹀悎瀹為檯鐨勶紝浣跨敤寰幆鏀硅繘锛屽彲浠ヤ笉鏂殑鎺ユ敹涓嶅悓鐢ㄦ埛鐨勬枃浠讹紝浠g爜濡備笅锛�

// 姣忔鎺ユ敹鏂扮殑杩炴帴,鍒涘缓涓�涓猄ocket
while锛坱rue锛墈
    Socket accept = serverSocket.accept();
    ......
}
  1. 鏁堢巼闂

    鏈嶅姟绔紝鍦ㄦ帴鏀跺ぇ鏂囦欢鏃讹紝鍙兘鑰楄垂鍑犵閽熺殑鏃堕棿锛屾鏃朵笉鑳芥帴鏀跺叾浠栫敤鎴蜂笂浼狅紝鎵�浠ワ紝浣跨敤澶氱嚎绋嬫妧鏈紭鍖栵紝浠g爜濡備笅锛�

while锛坱rue锛墈
    Socket accept = serverSocket.accept();
    // accept 浜ょ粰瀛愮嚎绋嬪鐞�.
    new Thread(() -> {
        ......
        InputStream bis = accept.getInputStream();
        ......
    }).start();
}

浼樺寲瀹炵幇

public class FileUpload_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟鍣� 鍚姩.....  ");
        // 1. 鍒涘缓鏈嶅姟绔疭erverSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        // 2. 寰幆鎺ユ敹,寤虹珛杩炴帴
        while (true) {
            Socket accept = serverSocket.accept();
            /* 
            3. socket瀵硅薄浜ょ粰瀛愮嚎绋嬪鐞�,杩涜璇诲啓鎿嶄綔
               Runnable鎺ュ彛涓�,鍙湁涓�涓猺un鏂规硶,浣跨敤lambda琛ㄨ揪寮忕畝鍖栨牸寮�
            */
            new Thread(() -> {
                try (
                    //3.1 鑾峰彇杈撳叆娴佸璞�
                    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
                    //3.2 鍒涘缓杈撳嚭娴佸璞�, 淇濆瓨鍒版湰鍦� .
                    FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
                    BufferedOutputStream bos = new BufferedOutputStream(fis);) {
                    // 3.3 璇诲啓鏁版嵁
                    byte[] b = new byte[1024 * 8];
                    int len;
                    while ((len = bis.read(b)) != -1) {
                      bos.write(b, 0, len);
                    }
                    //4. 鍏抽棴 璧勬簮
                    bos.close();
                    bis.close();
                    accept.close();
                    System.out.println("鏂囦欢涓婁紶宸蹭繚瀛�");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

淇℃伅鍥炲啓鍒嗘瀽鍥捐В

鍓嶅洓姝ヤ笌鍩烘湰鏂囦欢涓婁紶涓�鑷�.

  1. 銆愭湇鍔$銆戣幏鍙栬緭鍑烘祦锛屽洖鍐欐暟鎹��
  2. 銆愬鎴风銆戣幏鍙栬緭鍏ユ祦锛岃В鏋愬洖鍐欐暟鎹��

鍥炲啓瀹炵幇

public class FileUpload_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟鍣� 鍚姩.....  ");
        // 1. 鍒涘缓鏈嶅姟绔疭erverSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        // 2. 寰幆鎺ユ敹,寤虹珛杩炴帴
        while (true) {
            Socket accept = serverSocket.accept();
            /*
            3. socket瀵硅薄浜ょ粰瀛愮嚎绋嬪鐞�,杩涜璇诲啓鎿嶄綔
               Runnable鎺ュ彛涓�,鍙湁涓�涓猺un鏂规硶,浣跨敤lambda琛ㄨ揪寮忕畝鍖栨牸寮�
            */
            new Thread(() -> {
                try (
                    //3.1 鑾峰彇杈撳叆娴佸璞�
                    BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
                    //3.2 鍒涘缓杈撳嚭娴佸璞�, 淇濆瓨鍒版湰鍦� .
                    FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
                    BufferedOutputStream bos = new BufferedOutputStream(fis);
                ) {
                    // 3.3 璇诲啓鏁版嵁
                    byte[] b = new byte[1024 * 8];
                    int len;
                    while ((len = bis.read(b)) != -1) {
                        bos.write(b, 0, len);
                    }

                    // 4.=======淇℃伅鍥炲啓===========================
                    System.out.println("back ........");
                    OutputStream out = accept.getOutputStream();
                    out.write("涓婁紶鎴愬姛".getBytes());
                    out.close();
                    //================================

                    //5. 鍏抽棴 璧勬簮
                    bos.close();
                    bis.close();
                    accept.close();
                    System.out.println("鏂囦欢涓婁紶宸蹭繚瀛�");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

瀹㈡埛绔疄鐜帮細

public class FileUpload_Client {
    public static void main(String[] args) throws IOException {
        // 1.鍒涘缓娴佸璞�
        // 1.1 鍒涘缓杈撳叆娴�,璇诲彇鏈湴鏂囦欢
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
        // 1.2 鍒涘缓杈撳嚭娴�,鍐欏埌鏈嶅姟绔�
        Socket socket = new Socket("localhost", 6666);
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

        //2.鍐欏嚭鏁版嵁.
        byte[] b  = new byte[1024 * 8 ];
        int len ;
        while (( len  = bis.read(b))!=-1) {
            bos.write(b, 0, len);
        }
        // 鍏抽棴杈撳嚭娴�,閫氱煡鏈嶅姟绔�,鍐欏嚭鏁版嵁瀹屾瘯
        socket.shutdownOutput();
        System.out.println("鏂囦欢鍙戦�佸畬姣�");
        // 3. =====瑙f瀽鍥炲啓============
        InputStream in = socket.getInputStream();
        byte[] back = new byte[20];
        in.read(back);
        System.out.println(new String(back));
        in.close();
        // ============================

        // 4.閲婃斁璧勬簮
        socket.close();
        bis.close();
    }
}

3.2 妯℃嫙B\S鏈嶅姟鍣�(鎵╁睍鐭ヨ瘑鐐�)

妯℃嫙缃戠珯鏈嶅姟鍣紝浣跨敤娴忚鍣ㄨ闂嚜宸辩紪鍐欑殑鏈嶅姟绔▼搴忥紝鏌ョ湅缃戦〉鏁堟灉銆�

妗堜緥鍒嗘瀽

妯℃嫙BS鏈嶅姟鍣ㄥ垎鏋�.png
  1. 鍑嗗椤甸潰鏁版嵁锛寃eb鏂囦欢澶广��

    澶嶅埗鍒版垜浠琈odule涓�

  1. 鎴戜滑妯℃嫙鏈嶅姟鍣ㄧ锛孲erverSocket绫荤洃鍚鍙o紝浣跨敤娴忚鍣ㄨ闂�

    public static void main(String[] args) throws IOException {
         ServerSocket server = new ServerSocket(8000);
         Socket socket = server.accept();
         InputStream in = socket.getInputStream();
             byte[] bytes = new byte[1024];
         int len = in.read(bytes);
         System.out.println(new String(bytes,0,len));
         socket.close();
         server.close();
    }
    
  1. 鏈嶅姟鍣ㄧ▼搴忎腑瀛楄妭杈撳叆娴佸彲浠ヨ鍙栧埌娴忚鍣ㄥ彂鏉ョ殑璇锋眰淇℃伅

GET/web/index.html HTTP/1.1鏄祻瑙堝櫒鐨勮姹傛秷鎭��/web/index.html涓烘祻瑙堝櫒鎯宠璇锋眰鐨勬湇鍔″櫒绔殑璧勬簮,浣跨敤瀛楃涓插垏鍓叉柟寮忚幏鍙栧埌璇锋眰鐨勮祫婧愩��

//杞崲娴�,璇诲彇娴忚鍣ㄨ姹傜涓�琛�
BufferedReader readWb = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String requst = readWb.readLine();
//鍙栧嚭璇锋眰璧勬簮鐨勮矾寰�
String[] strArr = requst.split(" ");
//鍘绘帀web鍓嶉潰鐨�/
String path = strArr[1].substring(1);
System.out.println(path);

妗堜緥瀹炵幇

鏈嶅姟绔疄鐜帮細

public class SerDemo {
    public static void main(String[] args) throws IOException {
        System.out.println("鏈嶅姟绔�  鍚姩 , 绛夊緟杩炴帴 .... ");
        // 鍒涘缓ServerSocket 瀵硅薄
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        // 杞崲娴佽鍙栨祻瑙堝櫒鐨勮姹傛秷鎭�
        BufferedReader readWb = new
        BufferedReader(new InputStreamReader(socket.getInputStream()));
        String requst = readWb.readLine();
        // 鍙栧嚭璇锋眰璧勬簮鐨勮矾寰�
        String[] strArr = requst.split(" ");
        // 鍘绘帀web鍓嶉潰鐨�/
        String path = strArr[1].substring(1);
        // 璇诲彇瀹㈡埛绔姹傜殑璧勬簮鏂囦欢
        FileInputStream fis = new FileInputStream(path);
        byte[] bytes= new byte[1024];
        int len = 0 ;
        // 瀛楄妭杈撳嚭娴�,灏嗘枃浠跺啓浼氬鎴风
        OutputStream out = socket.getOutputStream();
        // 鍐欏叆HTTP鍗忚鍝嶅簲澶�,鍥哄畾鍐欐硶
        out.write("HTTP/1.1 200 OK\r\n".getBytes());
        out.write("Content-Type:text/html\r\n".getBytes());
        // 蹇呴』瑕佸啓鍏ョ┖琛�,鍚﹀垯娴忚鍣ㄤ笉瑙f瀽
        out.write("\r\n".getBytes());
        while((len = fis.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        fis.close();
        out.close();
        readWb.close(); 
        socket.close();
        server.close();
    }
}

璁块棶鏁堟灉

  • 鐏嫄

涓嶅悓鐨勬祻瑙堝櫒锛屽唴鏍镐笉涓�鏍凤紝瑙f瀽鏁堟灉鏈夊彲鑳戒笉涓�鏍枫��

鍙戠幇娴忚鍣ㄤ腑鍑虹幇寰堝鐨勫弶瀛�,璇存槑娴忚鍣ㄦ病鏈夎鍙栧埌鍥剧墖淇℃伅瀵艰嚧銆�

娴忚鍣ㄥ伐浣滃師鐞嗘槸閬囧埌鍥剧墖浼氬紑鍚竴涓嚎绋嬭繘琛屽崟鐙殑璁块棶,鍥犳鍦ㄦ湇鍔″櫒绔姞鍏ョ嚎绋嬫妧鏈��

public class ServerDemo {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        while(true){
            Socket socket = server.accept();
            new Thread(new Web(socket)).start();
        }
    }
    static class Web implements Runnable{
        private Socket socket;

        public Web(Socket socket){
            this.socket=socket;
        }

        public void run() {
            try{
                //杞崲娴�,璇诲彇娴忚鍣ㄨ姹傜涓�琛�
                BufferedReader readWb = new
                        BufferedReader(new InputStreamReader(socket.getInputStream()));
                String requst = readWb.readLine();
                //鍙栧嚭璇锋眰璧勬簮鐨勮矾寰�
                String[] strArr = requst.split(" ");
                System.out.println(Arrays.toString(strArr));
                String path = strArr[1].substring(1);
                System.out.println(path);

                FileInputStream fis = new FileInputStream(path);
                System.out.println(fis);
                byte[] bytes= new byte[1024];
                int len = 0 ;
                //鍚戞祻瑙堝櫒 鍥炲啓鏁版嵁
                OutputStream out = socket.getOutputStream();
                out.write("HTTP/1.1 200 OK\r\n".getBytes());
                out.write("Content-Type:text/html\r\n".getBytes());
                out.write("\r\n".getBytes());
                while((len = fis.read(bytes))!=-1){
                    out.write(bytes,0,len);
                }
                fis.close();
                out.close();
                readWb.close();
                socket.close();
            }catch(Exception ex){

            }
        }
    }

}

璁块棶鏁堟灉锛�

鍥捐В锛�

你可能感兴趣的:(缃戠粶缂栫▼)