บทความนี้อธิบายรหัสรายละเอียดของการเขียนโปรแกรมซ็อกเก็ต Java เพื่อใช้บริการอวยพรง่ายๆสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
ด้านเซิร์ฟเวอร์:
การใช้บริการสวัสดีที่ง่ายที่สุดพิมพ์ที่อยู่ IP ของไคลเอนต์ไปยังคอนโซลส่งสตริงอักขระ (สวัสดีซ็อกเก็ต Java) ไปยังไคลเอนต์ที่เชื่อมต่อและปิดการเชื่อมต่อกับไคลเอนต์ รอคำขอการเชื่อมต่อของลูกค้ารายต่อไปมาถึง
ลูกค้า:
ใช้ซ็อกเก็ตที่ง่ายที่สุดในการเชื่อมต่อกับ Hello Server ยอมรับข้อมูลไบต์ที่ส่งโดยเซิร์ฟเวอร์และพิมพ์เนื้อหาไปยังคอนโซล
เคล็ดลับสำคัญ:
เนื่องจาก Java ให้บริการ API อินพุตและเอาต์พุตจำนวนมากผู้เริ่มต้นจำนวนมากจึงได้สัมผัสกับการเขียนโปรแกรมซ็อกเก็ต Java และเนื่องจากพวกเขาขาดความเข้าใจเกี่ยวกับธรรมชาติของการสื่อสารไบต์เครือข่ายพวกเขาจึงรับกระแสซ็อกเก็ตไบต์โดยตรงโดย Readline () อย่างไรก็ตามเนื่องจากฝ่ายส่งไม่ส่ง /r /n ข้อมูลจึงไม่สามารถอ่านได้ นี่เป็นข้อผิดพลาดที่พบบ่อยที่สุด ข้อผิดพลาดทั่วไปอื่น ๆ รวมถึงการไม่เริ่มต้นบัฟเฟอร์การยอมรับส่งผลให้เกิดอักขระที่อ่านไม่ออกและไม่ได้ประกอบขึ้นใหม่ตามจำนวนไบต์ที่ได้รับจากการอ่านทำให้เกิดข้อยกเว้นสำหรับข้อมูลที่ได้รับ ดังนั้นรหัสแสดงให้เห็นถึงสิ่งที่ส่งโดย BYTE และการยอมรับโดย BYTE นี่เป็นแนวคิดและหลักการที่สำคัญมากในการเขียนโปรแกรมเครือข่าย ให้เมธอดอินพุตสตรีม println () และเมธอด Output readline () ไปที่นรก ไม่ใช่ว่าไม่ใช่เรื่องง่ายที่จะใช้ แต่ฉันขอแนะนำให้คุณไม่ได้ใช้เพราะสิ่งเหล่านั้นจะขัดขวางความเข้าใจและความเข้าใจของคุณเกี่ยวกับสาระสำคัญของการเขียนโปรแกรมเครือข่าย นอกจากนี้ฉันต้องการจดบันทึกพิเศษ: บางครั้งการล้าง () ไม่จำเป็นเว้นแต่คุณจะใช้กระแสอินพุตและเอาต์พุตบัฟเฟอร์เพื่ออ่านและเขียนไบต์
รหัสฝั่งเซิร์ฟเวอร์:
แพ็คเกจ com.gloomyfish.socket.tutorial.two; นำเข้า Java.io.DataOutputStream; นำเข้า java.io.ioException; นำเข้า java.net.serversocket; นำเข้า java.net.socket; ชั้นเรียนสาธารณะ HelloService ขยายเธรด {ส่วนตัว Serversocket Serversocket; Public HelloService (Int Port) พ่น IOException {Serversocket = ใหม่ Serversocket (พอร์ต); } โมฆะสาธารณะเรียกใช้ () {ลอง {ในขณะที่ (จริง) {system.out.println ("รอไคลเอนต์บนพอร์ต" + serversocket.getLocalport ()); ซ็อกเก็ตไคลเอนต์ = serversocket.accept (); // บล็อก & รอสำหรับซ็อกเก็ตรายได้ System.out.println ("เชื่อมต่อกับ" + client.getRemotesocketAddress ()); DataOrtputStream DOS = ใหม่ dataOutputStream (client.getOutputStream ()); ไบต์ [] สวัสดี = "สวัสดีซ็อกเก็ต Java" .getBytes (); dos.write (สวัสดี, 0, hello.length); dos.close (); client.close (); }} catch (exception e) {e.printstacktrace (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {HelloService Service = HelloService ใหม่ (9999); Service.start (); } catch (ioexception e) {e.printstacktrace (); - เซิร์ฟเวอร์ฟังพอร์ต 9999 และรอการเชื่อมต่อและใช้เธรด Java เพื่อเริ่มต้นการเริ่มต้นเซิร์ฟเวอร์
รหัสลูกค้ามีดังนี้:
แพ็คเกจ com.gloomyfish.socket.tutorial.two; นำเข้า java.io.datainputstream; นำเข้า java.io.ioException; นำเข้า java.net.inetsocketaddress; นำเข้า java.net.socketaddress; นำเข้า java.net.socketaddress; ชั้นเรียนสาธารณะ helloclient {private int clientNumber; ที่อยู่ซ็อกเก็ตส่วนตัวส่วนตัว public helloclient (int clientNum) {clientNum = clientNum; } โมฆะสาธารณะ SetupClients (String ServerHostName, int พอร์ต) พ่น IOException {address = new InetSocketAddress (ServerHostName, พอร์ต); สำหรับ (int i = 0; i <clientNumber; i ++) {system.out.println (); System.out.println ("เริ่มหมายเลขไคลเอนต์" + (i + 1)); ซ็อกเก็ตซ็อกเก็ต = ซ็อกเก็ตใหม่ (); Socket.Connect (ที่อยู่); datainputStream bufferedReader = ใหม่ datainputStream (socket.getInputStream ()); ไบต์ [] cbuff = ไบต์ใหม่ [256]; ถ่าน [] charbuff = ถ่านใหม่ [256]; ขนาด int = 0; ในขณะที่ ((size = bufferedreader.read (cbuff))> 0) {convertbytetochar (cbuff, charbuff, ขนาด); System.out.println (Charbuff); } bufferedReader.close (); Socket.close (); }} โมฆะส่วนตัว ConvertByTetochar (byte [] cbuff, char [] charbuff, ขนาด int) {สำหรับ (int i = 0; i <charbuff.length; i ++) {ถ้า (i <size) {charbuff [i] = (char) cbuff [i]; } else {charbuff [i] = ''; }}} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {helloclient client = helloclient ใหม่ (10); client.setupclients ("localhost", 9999); } catch (ioexception e) {e.printstacktrace (); - เริ่มต้น 10 ไคลเอนต์เพื่อเชื่อมต่อกับฝั่งเซิร์ฟเวอร์และหลังจากได้รับทักทายเซิร์ฟเวอร์ไคลเอนต์จะปิดการเชื่อมต่อ
เคล็ดลับพิเศษ: อย่าลืมเริ่มต้นบัฟเฟอร์ Charbuff
โปรแกรมการรันผลลัพธ์:
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน