ซ็อกเก็ตคืออะไร
สองโปรแกรมในเครือข่ายใช้การแลกเปลี่ยนข้อมูลผ่านการเชื่อมต่อการสื่อสารสองทาง ซ็อกเก็ตมักจะใช้เพื่อให้เกิดการเชื่อมต่อระหว่างลูกค้าและฝ่ายบริการ ซ็อกเก็ตเป็นอินเทอร์เฟซการเขียนโปรแกรมยอดนิยมของโปรโตคอล TCP/IP และซ็อกเก็ตจะถูกกำหนดโดยที่อยู่ IP และหมายเลขพอร์ต
อย่างไรก็ตามประเภทของโปรโตคอลที่รองรับโดยซ็อกเก็ตไม่เพียง แต่ TCP/IP ดังนั้นจึงไม่มีการเชื่อมต่อระหว่างทั้งสอง ในสภาพแวดล้อม Java การเขียนโปรแกรมซ็อกเก็ตส่วนใหญ่หมายถึงการเขียนโปรแกรมเครือข่ายตามโปรโตคอล TCP/IP
กระบวนการสื่อสารซ็อกเก็ต
ไม่ว่าเซิร์ฟเวอร์จะสิ้นสุดฟัง (มอนิเตอร์) มีคำขอการเชื่อมต่อไคลเอนต์จะส่งคำขอเชื่อมต่อไปยังฝั่งเซิร์ฟเวอร์และเซิร์ฟเวอร์ส่งข้อความการเข้าถึงกลับไปยังไคลเอนต์ มีการสร้างการเชื่อมต่อ ทั้งเซิร์ฟเวอร์และไคลเอนต์สามารถสื่อสารกับบุคคลอื่นผ่านการส่งเขียนและวิธีการอื่น ๆ
สำหรับซ็อกเก็ตที่มีคุณสมบัติเต็มรูปแบบจะต้องรวมโครงสร้างพื้นฐานต่อไปนี้
(1) สร้างซ็อกเก็ต
(2) เปิดอินพุต/การไหลออกที่เชื่อมต่อกับซ็อกเก็ต
(3) อ่าน/เขียนการทำงานของซ็อกเก็ตตามโปรโตคอลบางอย่าง
(4) ปิดซ็อกเก็ต ไม่ทำให้อะไรเกิดขึ้น
สร้างซ็อกเก็ต
Java ให้บริการซ็อกเก็ตและเซิร์ฟเวอร์สองประเภทใน java.net ซึ่งใช้เพื่อแสดงไคลเอนต์และเซิร์ฟเวอร์ของการเชื่อมต่อสองทาง เหล่านี้เป็นคลาสที่ดีมากสองชั้นที่ดีมากซึ่งสะดวกในการใช้งาน วิธีการโครงสร้างมีดังนี้:
ซ็อกเก็ต (ที่อยู่ indaddress, พอร์ต int); LocalAddr, int localport) ซ็อกเก็ต (Inetadddress ที่อยู่, intaddddress localddr, int localport) serversocket (พอร์ต int)
ในหมู่พวกเขาที่อยู่ IP ชื่อโฮสต์และหมายเลขพอร์ตของบุคคลอื่นในการเชื่อมต่อสองทางตามลำดับ ที่อยู่โฮสต์ของ Serversocket), Impl เป็นคลาสแม่ของซ็อกเก็ตซึ่งสามารถใช้ในการสร้าง Serversocket และสามารถใช้ในการสร้างซ็อกเก็ต การนับหมายถึงจำนวนการเชื่อมต่อสูงสุดที่เซิร์ฟเวอร์สามารถรองรับได้ ตัวอย่างเช่น: การเรียนรู้เครือข่ายวิดีโอ http://www.xxspw.com
ซ็อกเก็ตไคลเอนต์ = ซ็อกเก็ตใหม่
โปรดทราบว่าเมื่อเลือกพอร์ตคุณต้องระวัง แต่ละพอร์ตให้บริการเฉพาะ หมายเลขพอร์ต 0 ~ 1023 ถูกสงวนไว้โดยระบบ เลือกหมายเลขพอร์ตที่ดีที่สุดคือเลือกหนึ่งมากกว่า 1,023 จำนวนคือเพื่อป้องกันความขัดแย้ง
หากเกิดข้อผิดพลาดเมื่อสร้างซ็อกเก็ต IOException จะถูกสร้างขึ้นและจะต้องดำเนินการในโปรแกรม ดังนั้นการสร้างซ็อกเก็ตหรือเซิร์ฟเวอร์จะต้องถูกจับหรือโยน
รหัส
เซิร์ฟเวอร์
ซ็อกเก็ตแพ็คเกจ; นำเข้า Java.io.*; . ยอมรับ (); " +count +" เวลา! ) {flag = false; system.out.println ("ลูกค้าไม่ต้องการเล่นอีกต่อไป!");} else {system.out.println ("ไคลเอนต์กล่าวว่า:" + บรรทัด);}} ในที่สุด {ไคลเอนต์ { ไคลเอนต์ {client .close ();}} ในที่สุด {server.close ();}}}
ลูกค้า
ซ็อกเก็ตแพคเกจ; นำเข้า Java.io.*; . 0.1 ", 9091); ลอง {printwriter output = new printwriter (client.getPutStream (), true); Scanner cin = สแกนเนอร์ใหม่ (System.in); cin. nextline (); }}}}}}IP ที่มีผลผูกพันกับเซิร์ฟเวอร์
เมื่อเขียนซ็อกเก็ตด้วย c โครงสร้าง sockaddr_in สามารถระบุ sin_addr.s_addr นั่นคือคุณสามารถระบุที่อยู่ IP ได้
ฉันอาจต้องการผูกที่อยู่ IP ของการ์ดเครือข่าย ETH0 เนื่องจาก LO และ WLAN0 ของฉันอาจใช้โฮสต์เสมือนจริงของ Nginx กับพอร์ตเดียว
วางแผน
ตัวสร้างของ Serversocket มีดังนี้:
Public Serversocket (int พอร์ต, intaddddress bindddr) โยน ioexception
พารามิเตอร์:
พอร์ตพอร์ต -local TCP
ค้าง
bindaddr -จะถูกเบี่ยงเบนโดยเซิร์ฟเวอร์
เนื่องจาก Inetaddress ไม่มีตัวสร้างฉันได้รับการพันกันอยู่พักหนึ่ง
ตัวอย่างเช่นรหัส
indadress bindip = inetaddress.getByName ("192.168.1.168"); การเข้าถึงพร้อมกัน
เซิร์ฟเวอร์จัดการลูกค้าหลายรายโดยการเพิ่มคำขอหลายเธรดในเวลาเดียวกัน
รหัสเซิร์ฟเวอร์
แพ็คเกจ Capitalsocket; clientnum int คงที่ = 0; ), Capterize.ClientNum ++); (ซ็อกเก็ต S, ID int) {this.client = s; จริง) {สตริง data = input.readline (); ถ้า (data.equals ("bye") {system.out.println ("ปัจจุบัน" + this.id + + "ฉันไม่ต้องการเล่นไคลเอนต์!" ); break;} else {system.out.println ("current" + this.id + "กล่าว ;} catch (ioexception e) {e.printstacktrace ();}}}}}}}}}}}}}}}
รหัสไคลเอนต์รหัสไคลเอนต์ไม่มีการเปลี่ยนแปลงโดยทั่วไปเพิ่มการดำเนินการทางออก
Package Capitalsocket; 1.168 ", 9898); ลอง {output printWriter = ใหม่ PrintWriter (client.getOutputStream (), true); Scanner cin = เครื่องสแกนใหม่ (System.in); คำสตริง; ในขณะที่ (cin .hasnext ()) {words = cin NextLine (); ;} ในที่สุด {client.close ();}}}}