ซ็อกเก็ต Java (ซ็อกเก็ต) เป็นที่รู้จักกันทั่วไปว่า "ซ็อกเก็ต" ซึ่งอธิบายที่อยู่ IP และพอร์ตและเป็นที่จับของห่วงโซ่การสื่อสาร แอปพลิเคชันมักจะร้องขอหรือตอบคำขอเครือข่ายผ่าน "ซ็อกเก็ต"
ใช้ซ็อกเก็ตเพื่อตระหนักถึงการสื่อสารระหว่างลูกค้าหลายรายและไคลเอนต์เดียวกัน ก่อนอื่นไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์เพื่อส่งข้อความเซิร์ฟเวอร์จะประมวลผลข้อความหลังจากได้รับข้อความแล้วตอบกลับไคลเอนต์ไปยังข้อความหลังจากเสร็จสิ้น ฉันได้เขียนรหัสที่ใช้โดยเซิร์ฟเวอร์และไคลเอนต์ผ่านความคิดของฉันเองหวังว่าจะได้เรียนรู้จากทุกคนและดำเนินการด้วยกัน
รหัสเซิร์ฟเวอร์
/** * ซ็อกเก็ตเซิร์ฟเวอร์ * ฟังก์ชั่นคำอธิบาย: * */เซิร์ฟเวอร์คลาสสาธารณะ {/** * รายการ * * @param args * @throws ioexception */โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยน ioexception {// สำหรับความเรียบง่ายข้อมูลข้อยกเว้นทั้งหมด Serversocket (พอร์ต); System.out.println ("รอการเชื่อมต่อกับไคลเอนต์ ... "); ในขณะที่ (จริง) {// เซิร์ฟเวอร์พยายามรับคำขอการเชื่อมต่อจากซ็อกเก็ตอื่น ๆ วิธีการยอมรับของเซิร์ฟเวอร์คือซ็อกเก็ตซ็อกเก็ตปิดกั้น = เซิร์ฟเวอร์ Accept ();/*** เซิร์ฟเวอร์ของเราจัดการคำขอการเชื่อมต่อของไคลเอ็นต์แบบซิงโครนัส ทุกครั้งที่เราได้รับคำขอการเชื่อมต่อจากไคลเอนต์ * เราต้องสื่อสารกับไคลเอนต์ปัจจุบันก่อนที่จะประมวลผลคำขอการเชื่อมต่อครั้งต่อไป สิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพของโปรแกรมอย่างจริงจังเมื่อมีการพร้อมกันมากขึ้น * ด้วยเหตุนี้เราสามารถเปลี่ยนเป็นการประมวลผลแบบอะซิงโครนัสต่อไปนี้ของการสื่อสารกับไคลเอนต์* /// ทุกครั้งที่ได้รับซ็อกเก็ตเธรดใหม่จะถูกสร้างขึ้นเพื่อจัดการกับเธรดใหม่ (งานใหม่ (ซ็อกเก็ต)) เริ่มต้น ();} // เซิร์ฟเวอร์ ภารกิจ (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต;} @การแทนที่โมฆะสาธารณะเรียกใช้ () {ลอง {handlersocket ();} catch (ข้อยกเว้น e) {e.printstacktrace ();}}/** * สื่อสารกับซ็อกเก็ตไคลเอ็นต์ * * @throws อินพุตของซ็อกเก็ตและอ่านข้อมูลที่ส่งโดยไคลเอนต์จาก IT/*** เมื่อได้รับข้อมูลจากอินพุตของซ็อกเก็ตการอ่านเล็กน้อยเหมือนข้างต้นนั้นซับซ้อนเกินไป * บางครั้งเราจะเปลี่ยนเป็นการใช้ bufferedReader เพื่ออ่านทีละบรรทัด * * วิธีการอ่านแบบ readline ของ bufferedReader อ่านทีละบรรทัด วิธีนี้ถูกบล็อก โปรแกรมจะไม่ดำเนินการต่อไปจนกว่าจะอ่านบรรทัดของข้อมูล * แล้ว readline จะอ่านบรรทัดเมื่อใด วิธีการอ่านแบบอ่านจะไม่คิดว่ามีการอ่านบรรทัดแล้วและ * จะจบการบล็อกและปล่อยให้โปรแกรมดำเนินการต่อไป * ดังนั้นเมื่อเราใช้ readline ของ bufferedreader เพื่ออ่านข้อมูลเราต้องจำไว้ว่าให้เขียนตัวแบ่งบรรทัดในกระแสเอาต์พุตที่สอดคล้องกัน (* จะถูกทำเครื่องหมายโดยอัตโนมัติเมื่อสิ้นสุดหลังจากสตรีมสิ้นสุดลงและสามารถรับรู้ได้) หลังจากเขียนเส้นแบ่งบรรทัดเราต้องจำไว้ว่าต้องล้างหากสตรีมเอาท์พุทไม่ได้ปิดทันที * จากนั้นข้อมูลจะถูกเขียนจากบัฟเฟอร์อย่างแท้จริง */bufferedReader br = new bufferedReader (new InputStreamReader (socket.getInputStream (), "UTF -8")); StringBuilder SB = ใหม่ StringBuilder (); String temp; int index; ในขณะที่ (temp = br.readline () sb.append (temp.substring (0, index)); break;} sb.append (temp);} system.out.println ("ฟอร์มไคลเอนต์ [พอร์ต:" + socket.getport () + "] เนื้อหาข้อความ:" sb.toString (); "utf-8"); writer.write (string.format ("สวัสดี,%d. ท้องฟ้าสว่างและอากาศใสลมก็ราบรื่น!", socket.getport ())); writer.flush (); writer.close (); system.out.println ("ไปยังไคลเอนต์ [พอร์ต:" ประสบความสำเร็จ "); br.close (); socket.close ();}}}รหัสลูกค้า
นำเข้า java.io.InputStreamReader; นำเข้า java.io.OutputStreamWriter; นำเข้า java.io.Reader; นำเข้า java.Io.writer; นำเข้า java.net.socket;/*** ซ็อกเก็ตไคลเอนต์*************************************************************** */public static void main (string [] args) {// เปิดไคลเอนต์สามเธรดหนึ่งแสดงถึงไคลเอนต์สำหรับ (int i = 0; i <3; i ++) {เธรดใหม่ (ใหม่ runnable () {@Override public void run () {ลอง {testclient client = testClientFactory.createclient วันหยุดสุดสัปดาห์? ", client.client.getLocalport ())); client.receive ();} catch (ข้อยกเว้น e) {e.printstacktrace ();}}}) เริ่มต้น ();}}/*** โรงงาน testClient ("127.0.0.1", 8899);}}/*** ทดสอบไคลเอนต์*/คลาสสแตติก testclient {/*** constructor* @param โฮสต์ที่อยู่ IP ของเซิร์ฟเวอร์ที่จะเชื่อมต่อ* @param พอร์ตการฟังที่สอดคล้องกันของเซิร์ฟเวอร์ ซ็อกเก็ต (โฮสต์, พอร์ต); System.out.println ("ไคลเอนต์ [พอร์ต:" + client.getLocalport () + "] สร้างการเชื่อมต่อกับเซิร์ฟเวอร์ ... ");} ซ็อกเก็ตส่วนตัวไคลเอนต์ไคลเอนต์นักเขียนส่วนตัว;/** * ส่งข้อความ * @param msg * @throws {writer = new OutputStreamWriter (client.getOutputStream (), "utf-8");} writer.write (msg); writer.write ("eof/n"); writer.flush (); // หลังจากเขียนแล้ว ข้อยกเว้น @throws */โมฆะสาธารณะได้รับ () พ่นข้อยกเว้น {// อ่านหลังจากเขียนตัวอ่านตัวอ่าน = new InputStreamReader (client.getInputStream (), "UTF-8"); // ตั้งเวลาที่จะรับข้อมูลเป็น 10 วินาที client.setSotimeout (10 *1000); char [] chars = new Chars reader.read (chars))! = -1) {sb.append (สตริงใหม่ (chars, 0, len));} system.out.println ("ไคลเอนต์ [พอร์ต:" + client.getLocalport () + "] ข้อความได้รับเนื้อหา:" sb.tostring (); reader.close (); writer.close (); client.close ();}}}ถัดไปมาจำลอง:
1. เรียกใช้เซิร์ฟเวอร์ก่อน
2. จากนั้นเรียกใช้ไคลเอนต์ (เปิดสามคำขอไคลเอนต์)
สำหรับการสาธิตฉันใช้เครื่องมือ Eclipse บนเซิร์ฟเวอร์และเครื่องมือ Idea Idea บนไคลเอนต์ ในเวลานี้คุณสามารถดูข้อความที่ลูกค้าพิมพ์บนคอนโซล
หมายเลขพอร์ตแสดงถึงไคลเอนต์ ลองดูข้อความที่พิมพ์โดยเซิร์ฟเวอร์บนคอนโซลกันเถอะ
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับซ็อกเก็ตการเขียนโปรแกรม Java ที่ใช้ไคลเอนต์หลายตัวเพื่อเชื่อมต่อกับรหัสเซิร์ฟเวอร์เดียวกัน ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความไว้และบรรณาธิการจะตอบกลับทุกคนทันเวลา