เขียนก่อน:
บางทีมันอาจจะเป็นจุดสิ้นสุดของช่วงเวลาและการออกแบบหลักสูตรต่าง ๆ กำลังจะมาถึงอีกครั้ง เมื่อเร็ว ๆ นี้ฉันเห็นคำถามและคำตอบสองข้อเกี่ยวกับ CSSDN ซึ่งคือการเขียนโปรแกรมแชทที่ใช้ซ็อกเก็ต ฉันเคยทำอะไรบางอย่างกับซ็อกเก็ตเมื่อเร็ว ๆ นี้ ฉันใช้เวลาว่างสองสามคืนในการเคาะ ปัจจุบันรองรับการแชทเดียวการแชทกลุ่มและฟังก์ชั่นการถ่ายโอนไฟล์ ก่อนอื่นฉันโพสต์ภาพโปรแกรมที่น่าเกลียด (UI เขียนด้วย Java Swing ฉันลืมภาพนี้มานานแล้วดังนั้นฉันจึงอดไม่ได้ที่จะอ่าน JDK API เพื่อเขียนหนึ่ง) ดังที่แสดงด้านล่าง:
การออกแบบเซิร์ฟเวอร์:
เซิร์ฟเวอร์มีการดำเนินการหลักสองประการ: หนึ่งคือการบล็อกซ็อกเก็ตของไคลเอนต์ที่ได้รับและทำการประมวลผลการตอบกลับและอีกอย่างคือการตรวจจับการเต้นของหัวใจของไคลเอนต์ หากลูกค้าไม่ได้ส่ง HeartBeat เป็นระยะเวลาหนึ่งให้ลบไคลเอนต์สร้าง Serversocket แล้วเริ่มพูลสองเธรดเพื่อจัดการสองสิ่งนี้ (NewFixedThreadPool, NewsCheduleDTHREADPOOL) คลาสการประมวลผลที่สอดคล้องกันคือ SocketDispatcher และ SocketSchedule SocketDispatcher ถูกแจกจ่ายให้กับถุงเท้าที่แตกต่างกันตามคำขอซ็อกเก็ตที่แตกต่างกัน SocketWrapper เพิ่มเสื้อคลุมเชลล์ลงในซ็อกเก็ตและบันทึกเวลาการโต้ตอบล่าสุดของซ็อกเก็ตด้วย Socketholder เก็บคอลเลกชันซ็อกเก็ตที่โต้ตอบกับเซิร์ฟเวอร์ในปัจจุบัน การออกแบบมีดังนี้:
การออกแบบลูกค้า:
การออกแบบลูกค้าส่วนใหญ่แบ่งออกเป็นสองส่วนคือการออกแบบโมดูลการสื่อสารซ็อกเก็ตและการออกแบบที่เกี่ยวข้องกับ UI
การออกแบบการสื่อสารซ็อกเก็ตไคลเอนต์นั้นคล้ายกับเซิร์ฟเวอร์ ความแตกต่างคือเซิร์ฟเวอร์ได้รับแพ็กเก็ต HeartBeat ในขณะที่ไคลเอนต์ส่งแพ็กเก็ต HeartBeat เนื่องจากไคลเอ็นต์เท่านั้นที่สื่อสารกับเซิร์ฟเวอร์เดียว (การสื่อสารระหว่างไคลเอนต์จะถูกแจกจ่ายโดยเซิร์ฟเวอร์) มีเพียงพูลเธรดที่มีขนาด 2 เท่านั้นที่ใช้ในการจัดการสองสิ่งนี้ (NewFixedThreadPool (2)) คลาสการประมวลผลที่สอดคล้องกันคือผู้รับและ keepalivedog เมื่อเริ่มต้นรับการเริ่มต้นการโทรกลับจะถูกส่งเป็นการโทรกลับไปยังไคลเอนต์จะได้รับข้อความเซิร์ฟเวอร์ การใช้งานเริ่มต้นของการโทรกลับเป็นค่าเริ่มต้น defaultCallback ถูกแจกจ่ายให้กับตัวจัดการที่แตกต่างกันผ่าน HF ตามเหตุการณ์ที่แตกต่างกัน ผู้จัดเก็บข้อมูลลูกค้าปัจจุบัน การออกแบบมีดังนี้:
การออกแบบที่เกี่ยวข้องกับ UI ฉันไม่ได้วางแผนที่จะเขียน UI ด้วยตัวเอง ท้ายที่สุดสิ่งที่ฉันเขียนนั้นน่าเกลียดเกินไปดังนั้นฉันอาจขอให้เพื่อนร่วมชั้นหรือเพื่อนของฉันช่วยฉันเคาะมันในภายหลังดังนั้นฉันจึงส่งมอบการประมวลผลเหตุการณ์ UI เพื่อดำเนินการเพื่อจัดการกับมันและแยกการออกแบบ UI และการตอบสนองเหตุการณ์ UIs ทั้งหมดสืบทอด JFrame และใช้อินเทอร์เฟซมุมมอง คลาสการใช้งานตัวจัดการด้านบนจะได้รับผ่านเราเตอร์ (จะถูกส่งคืนโดยตรงหากมีอยู่และจะถูกสร้างและจัดเก็บหากไม่มีอยู่) มุมมองให้การสร้าง UI (), รับคอนเทนเนอร์ (), รับส่วนประกอบใน UI getComponent (), แสดงผลการแสดงผล () และรีไซเคิลถังขยะ (); ResultWrapper และ Resultholder เป็นเพียงการสร้างและจัดเก็บแท็บแชท
การออกแบบโมดูลทั่วไป:
โมดูลทั่วไปคือการโต้ตอบข้อมูลส่วนใหญ่โดยที่ข้อมูล JSON จะใช้สำหรับการโต้ตอบ โมดูลทั่วไปกำหนดข้อมูลการโต้ตอบประเภทต่าง ๆ การส่งข้อมูลซ็อกเก็ตที่ใช้โดย SendHelper, I18N เป็นภาษาและค่าคงที่คือการกำหนดค่าและค่าคงที่ในระบบ (ค่าคงที่เป็นอินเทอร์เฟซทั้งหมดซึ่งอาจไม่ดีมาก) สำหรับ returnMessage มันมีชุดของ DTOs เป็นคุณลักษณะเนื้อหา
รายการโปรแกรม:
ในที่สุดโปรแกรมทางเข้าสำหรับเซิร์ฟเวอร์และไคลเอนต์จะได้รับ (รหัสที่สมบูรณ์ถูกแขวนไว้บน CSDN และจะได้รับการปรับปรุงอย่างต่อเนื่องหากคุณมีเวลาและบทความจะมีที่อยู่ในตอนท้าย)
พอร์ทัลเซิร์ฟเวอร์:
แพ็คเกจ yaolin.chat.server; นำเข้า java.io.ioexception; นำเข้า java.net.serversocket; นำเข้า java.util.date นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.Current.executors; java.util.concurrent.timeUnit; นำเข้า yaolin.chat.common.constantValue; นำเข้า yaolin.chat.util.loggerutil;/*** เซิร์ฟเวอร์* @author yaolin*/เซิร์ฟเวอร์คลาสสาธารณะ Private Executorservice Pool; เซิร์ฟเวอร์สาธารณะ () พ่น IOException {เซิร์ฟเวอร์ = ใหม่ Serversocket (ConstantValue.server_port); pool = executors.newFixedThreadPool (ConstantValue.max_pool_size); } public void start () {ลอง {scheduleDexecutorservice schedule = executors.newscheduledThreadPool (1); // ดูสุนัข ข้อยกเว้น ?? กำหนดการ SCHEDULEATFIXEDRATE (SOCKETSCHEDULE ใหม่ (), 10, ConstantValue.Time_Out, TimeUnit.Seconds); ในขณะที่ (จริง) {pool.execute (SocketDispatcher ใหม่ (Server.accept ())); loggerutil.info ("ยอมรับไคลเอนต์ที่" + วันที่ใหม่ ()); }} catch (ioexception e) {pool.shutdown (); }} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {เซิร์ฟเวอร์ใหม่ (). start (); } catch (ioexception e) {loggerutil.error ("เซิร์ฟเวอร์เริ่มล้มเหลว! ->" + e.getMessage (), e); - พอร์ทัลลูกค้า:
แพ็คเกจ yaolin.chat.client; นำเข้า java.io.ioexception; นำเข้า Javax.swing.joptionpane; นำเข้า yaolin.chat.client. Yaolin * */คลาสสาธารณะ niloaychat {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {registerandloginView v = (registerandloginView) เราเตอร์. getView (registerandloginView.class) .create (); ลอง {V.Display (); ไคลเอนต์ไคลเอนต์ = ไคลเอนต์ใหม่ (ใหม่ defaultCallback ()); client.start (); clientholder.setClient (ไคลเอนต์); } catch (ioexception e) {joptionpane.showMessagedialog (v.getContentPane (), e.getMessage ()); - ดาวน์โหลดซอร์สโค้ด: สาธิต
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น