鍐呭棰勮
- 杞欢鏋舵瀯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鐨勪氦鎹㈣繃绋嬪涓嬪浘鎵�绀恒��
鐗圭偣:鏁版嵁琚檺鍒跺湪64kb浠ュ唴锛岃秴鍑鸿繖涓寖鍥村氨涓嶈兘鍙戦�佷簡銆�
鏁版嵁鎶�(Datagram):缃戠粶浼犺緭鐨勫熀鏈崟浣�
-
TCP锛氫紶杈撴帶鍒跺崗璁� (Transmission Control Protocol)銆俆CP鍗忚鏄�闈㈠悜杩炴帴鐨勯�氫俊鍗忚锛屽嵆浼犺緭鏁版嵁涔嬪墠锛屽湪鍙戦�佺鍜屾帴鏀剁寤虹珛閫昏緫杩炴帴锛岀劧鍚庡啀浼犺緭鏁版嵁锛屽畠鎻愪緵浜嗕袱鍙拌绠楁満涔嬮棿鍙潬鏃犲樊閿欑殑鏁版嵁浼犺緭銆�
鍦═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锛夈��
涓ょ閫氫俊鏃舵楠わ細
- 鏈嶅姟绔▼搴忥紝闇�瑕佷簨鍏堝惎鍔紝绛夊緟瀹㈡埛绔殑杩炴帴銆�
- 瀹㈡埛绔富鍔ㄨ繛鎺ユ湇鍔″櫒绔紝杩炴帴鎴愬姛鎵嶈兘閫氫俊銆傛湇鍔$涓嶅彲浠ヤ富鍔ㄨ繛鎺ュ鎴风銆�
鍦↗ava涓紝鎻愪緵浜嗕袱涓被鐢ㄤ簬瀹炵幇TCP閫氫俊绋嬪簭锛�
- 瀹㈡埛绔細
java.net.Socket
绫昏〃绀恒�傚垱寤�Socket
瀵硅薄锛屽悜鏈嶅姟绔彂鍑鸿繛鎺ヨ姹傦紝鏈嶅姟绔搷搴旇姹傦紝涓よ�呭缓绔嬭繛鎺ュ紑濮嬮�氫俊銆� - 鏈嶅姟绔細
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閫氫俊鍒嗘瀽鍥捐В
- 銆愭湇鍔$銆戝惎鍔�,鍒涘缓ServerSocket瀵硅薄锛岀瓑寰呰繛鎺ャ��
- 銆愬鎴风銆戝惎鍔�,鍒涘缓Socket瀵硅薄锛岃姹傝繛鎺ャ��
- 銆愭湇鍔$銆戞帴鏀惰繛鎺�,璋冪敤accept鏂规硶锛屽苟杩斿洖涓�涓猄ocket瀵硅薄銆�
- 銆愬鎴风銆慡ocket瀵硅薄锛岃幏鍙朞utputStream锛屽悜鏈嶅姟绔啓鍑烘暟鎹��
- 銆愭湇鍔$銆慡coket瀵硅薄锛岃幏鍙朓nputStream锛岃鍙栧鎴风鍙戦�佺殑鏁版嵁銆�
鍒版锛屽鎴风鍚戞湇鍔$鍙戦�佹暟鎹垚鍔熴��
鑷锛屾湇鍔$鍚戝鎴风鍥炲啓鏁版嵁銆�
- 銆愭湇鍔$銆慡ocket瀵硅薄锛岃幏鍙朞utputStream锛屽悜瀹㈡埛绔洖鍐欐暟鎹��
- 銆愬鎴风銆慡coket瀵硅薄锛岃幏鍙朓nputStream锛岃В鏋愬洖鍐欐暟鎹��
- 銆愬鎴风銆戦噴鏀捐祫婧愶紝鏂紑杩炴帴銆�
瀹㈡埛绔悜鏈嶅姟鍣ㄥ彂閫佹暟鎹�
鏈嶅姟绔疄鐜帮細
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 鏂囦欢涓婁紶妗堜緥
鏂囦欢涓婁紶鍒嗘瀽鍥捐В
- 銆愬鎴风銆戣緭鍏ユ祦锛屼粠纭洏璇诲彇鏂囦欢鏁版嵁鍒扮▼搴忎腑銆�
- 銆愬鎴风銆戣緭鍑烘祦锛屽啓鍑烘枃浠舵暟鎹埌鏈嶅姟绔��
- 銆愭湇鍔$銆戣緭鍏ユ祦锛岃鍙栨枃浠舵暟鎹埌鏈嶅姟绔▼搴忋��
- 銆愭湇鍔$銆戣緭鍑烘祦锛屽啓鍑烘枃浠舵暟鎹埌鏈嶅姟鍣ㄧ‖鐩樹腑銆�
鍩烘湰瀹炵幇
鏈嶅姟绔疄鐜帮細
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("鏂囦欢涓婁紶瀹屾瘯 ");
}
}
鏂囦欢涓婁紶浼樺寲鍒嗘瀽
-
鏂囦欢鍚嶇О鍐欐鐨勯棶棰�
鏈嶅姟绔紝淇濆瓨鏂囦欢鐨勫悕绉板鏋滃啓姝伙紝閭d箞鏈�缁堝鑷存湇鍔″櫒纭洏锛屽彧浼氫繚鐣欎竴涓枃浠讹紝寤鸿浣跨敤绯荤粺鏃堕棿浼樺寲锛屼繚璇佹枃浠跺悕绉板敮涓�锛屼唬鐮佸涓嬶細
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis()+".jpg") // 鏂囦欢鍚嶇О
BufferedOutputStream bos = new BufferedOutputStream(fis);
-
寰幆鎺ユ敹鐨勯棶棰�
鏈嶅姟绔紝鎸囦繚瀛樹竴涓枃浠跺氨鍏抽棴浜嗭紝涔嬪悗鐨勭敤鎴锋棤娉曞啀涓婁紶锛岃繖鏄笉绗﹀悎瀹為檯鐨勶紝浣跨敤寰幆鏀硅繘锛屽彲浠ヤ笉鏂殑鎺ユ敹涓嶅悓鐢ㄦ埛鐨勬枃浠讹紝浠g爜濡備笅锛�
// 姣忔鎺ユ敹鏂扮殑杩炴帴,鍒涘缓涓�涓猄ocket
while锛坱rue锛墈
Socket accept = serverSocket.accept();
......
}
-
鏁堢巼闂
鏈嶅姟绔紝鍦ㄦ帴鏀跺ぇ鏂囦欢鏃讹紝鍙兘鑰楄垂鍑犵閽熺殑鏃堕棿锛屾鏃朵笉鑳芥帴鏀跺叾浠栫敤鎴蜂笂浼狅紝鎵�浠ワ紝浣跨敤澶氱嚎绋嬫妧鏈紭鍖栵紝浠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();
}
}
}
淇℃伅鍥炲啓鍒嗘瀽鍥捐В
鍓嶅洓姝ヤ笌鍩烘湰鏂囦欢涓婁紶涓�鑷�.
- 銆愭湇鍔$銆戣幏鍙栬緭鍑烘祦锛屽洖鍐欐暟鎹��
- 銆愬鎴风銆戣幏鍙栬緭鍏ユ祦锛岃В鏋愬洖鍐欐暟鎹��
鍥炲啓瀹炵幇
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鏈嶅姟鍣�(鎵╁睍鐭ヨ瘑鐐�)
妯℃嫙缃戠珯鏈嶅姟鍣紝浣跨敤娴忚鍣ㄨ闂嚜宸辩紪鍐欑殑鏈嶅姟绔▼搴忥紝鏌ョ湅缃戦〉鏁堟灉銆�
妗堜緥鍒嗘瀽
-
鍑嗗椤甸潰鏁版嵁锛寃eb鏂囦欢澶广��
澶嶅埗鍒版垜浠琈odule涓�
-
鎴戜滑妯℃嫙鏈嶅姟鍣ㄧ锛孲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(); }
- 鏈嶅姟鍣ㄧ▼搴忎腑瀛楄妭杈撳叆娴佸彲浠ヨ鍙栧埌娴忚鍣ㄥ彂鏉ョ殑璇锋眰淇℃伅
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){
}
}
}
}
璁块棶鏁堟灉锛�
鍥捐В锛�