บทความนี้แบ่งปันตัวอย่างเพื่อตอบสนองความต้องการของการสื่อสารบนเว็บออนไลน์ เนื่องจากฟังก์ชั่นการแชทออนไลน์เวอร์ชันเว็บที่ใช้โดย Java Socket สำหรับการอ้างอิงของคุณเนื้อหาเฉพาะมีดังนี้
ขั้นตอนการใช้งาน:
1. ใช้ส่วนประกอบ AWT และซ็อกเก็ตเพื่อใช้ไคลเอนต์เดี่ยวอย่างง่ายเพื่อส่งข้อความไปยังเซิร์ฟเวอร์อย่างต่อเนื่อง
2. รวมกับเธรดตระหนักถึงการเชื่อมต่อหลายไคลเอนต์ไปยังเซิร์ฟเวอร์เพื่อส่งข้อความ
3. ใช้ข้อความไคลเอนต์การส่งต่อเซิร์ฟเวอร์ไปยังไคลเอนต์ทั้งหมดและแสดงบนไคลเอนต์ในเวลาเดียวกัน
4. เปลี่ยนอินเตอร์เฟสหน้าต่างที่สร้างขึ้นโดยส่วนประกอบ AWT เป็นอินเทอร์เฟซที่แสดงโดย JSP หรือ HTML front-end และเปลี่ยนไคลเอนต์ที่ใช้โดย Java Socket ไปสู่การใช้งานเทคโนโลยีส่วนหน้า
ที่นี่เราใช้ฟังก์ชั่นง่าย ๆ ของขั้นตอนแรกความยากคือ:
1. ฉันไม่เคยใช้องค์ประกอบ AWT และฉันไม่เคยใช้กิจกรรมการฟังที่เกี่ยวข้องกับ Java
2. ฉันไม่ได้ใช้ซ็อกเก็ตเป็นเวลานานในการโต้ตอบระหว่างไคลเอนต์และเซิร์ฟเวอร์และฉันยังไม่ได้พัฒนาโครงสร้าง CSS
รหัสเพื่อใช้งานฟังก์ชั่น :
ลูกค้าแชทออนไลน์:
1. สร้างโครงร่างอินเตอร์เฟสหน้าต่างกราฟิก
2. เพิ่มเหตุการณ์ปิดลงในโครงร่าง
3. เพิ่มพื้นที่อินพุตและพื้นที่แสดงเนื้อหาลงในโครงร่าง
4. เพิ่มเหตุการณ์การส่งคืนรถไปยังพื้นที่อินพุต
5. สร้างการเชื่อมต่อเซิร์ฟเวอร์และส่งข้อมูล
แพ็คเกจแชทแชท; นำเข้า Java.awt.BorderLayout; นำเข้า java.awt.frame; นำเข้า Java.awt.TextArea; นำเข้า Java.awt.TextField; นำเข้า java.awt.event.actionEvent; นำเข้า java.awt.event.actionListener; นำเข้า java.awt.event.windowadapter; นำเข้า java.awt.event.windowevent; นำเข้า Java.io.DataOutputStream; นำเข้า java.io.ioException; นำเข้า java.net.socket; นำเข้า java.net.unknownhostexception; / ** * ไคลเอ็นต์แชทออนไลน์ 1. สร้างอินเทอร์เฟซหน้าต่างกราฟิกโครงร่าง 2. เพิ่มเหตุการณ์ปิดลงในโครงร่าง 3. เพิ่มพื้นที่อินพุตและพื้นที่แสดงเนื้อหาลงในโครงร่าง 4. เพิ่มเหตุการณ์การส่งคืนรถสำหรับพื้นที่อินพุต * 5. สร้างการเชื่อมต่อเซิร์ฟเวอร์และส่งข้อมูล * * @author Tuzongxun123 * * // การแสดงเนื้อหาพื้นที่ textarea ส่วนตัว taste = new textarea (); ซ็อกเก็ตซ็อกเก็ตส่วนตัว = null; // การส่งออกข้อมูล Data DataOutputStream DataOutputStream = NULL; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {chatclient ใหม่ (). launcframe (); } / ** * สร้างหน้าต่างกราฟิกง่าย ๆ * * @author: tuzongxun * @title: launcframe * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:00 am * @throws * / โมฆะสาธารณะ launcframe () {setLocation (300, 200); this.setsize (200, 400); เพิ่ม (tftxt, borderlayout.south); เพิ่ม (Tarea, Borderlayout.north); หีบห่อ(); // ฟังเหตุการณ์การปิดของหน้าต่างอินเตอร์เฟสกราฟิก this.addWindowListener (ใหม่ windowAdapter () {@Override โมฆะสาธารณะ windowclosing (windowEvent e) {system.exit (0); disconnect ();}}); tftxt.addactionListener (ใหม่ tflister ()); setVisible (จริง); เชื่อมต่อ(); } / ** * เชื่อมต่อกับเซิร์ฟเวอร์ * * @author: tuzongxun * @title: เชื่อมต่อ * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:56:49 am * @throws * / โมฆะสาธารณะเชื่อมต่อ () {ลอง {// // รับสตรีมเอาต์พุตไคลเอ็นต์ DataOutputStream = ใหม่ dataOrmputStream (socket.get.getOutputStream ()); System.out.println ("เชื่อมต่อกับเซิร์ฟเวอร์"); } catch (unknownhostexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} / ** * ปิดแหล่งข้อมูลลูกค้า * * @author: tuzongxun * @title: disconnect * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:46 am * @throws * / โมฆะสาธารณะ disconnect () {ลอง {dataOutputStream.close (); Socket.close (); } catch (ioexception e) {e.printstacktrace (); }} / ** * ส่งข้อความไปยังเซิร์ฟเวอร์ * * @author: tuzongxun * @title: sendmessage * @param @param text * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:56 am * @throws * / โมฆะส่วนตัว dataOrtputStream.flush (); } catch (ioexception e1) {e1.printstacktrace (); }} / ** * พื้นที่อินพุตหน้าต่างกราฟิกเพื่อฟังเหตุการณ์การส่งคืนรถ * * @author tuzongxun123 * * / คลาสส่วนตัว tflister ใช้ actionListener {@Override โมฆะสาธารณะ actionperformed taxa.settext (ข้อความ); tftxt.settext (""); // ส่งข้อมูลไปยังเซิร์ฟเวอร์ sendMessage (ข้อความ); - เซิร์ฟเวอร์:
แพ็คเกจแชทแชท; นำเข้า java.io.datainputstream; นำเข้า java.io.eofexception; นำเข้า java.io.ioException; นำเข้า java.net.bindexception; นำเข้า java.net.serversocket; นำเข้า java.net.socket; /*** Java ใช้ซ็อกเก็ตและส่วนประกอบ AWT เพื่อใช้ฟังก์ชั่นการแชทออนไลน์ เซิร์ฟเวอร์สามารถรับรู้เซิร์ฟเวอร์เพื่อส่งข้อความไปยังเซิร์ฟเวอร์อย่างต่อเนื่องหลังจากเชื่อมต่อไคลเอนต์หนึ่ง* แต่ไม่สนับสนุนไคลเอนต์หลายตัวเพื่อเชื่อมต่อในเวลาเดียวกัน เหตุผลก็คือหลังจากได้รับการเชื่อมต่อไคลเอนต์ในรหัสแล้วมันจะฟังอินพุตไคลเอนต์ที่วนลูปทำให้เกิดการอุดตัน* เพื่อให้เซิร์ฟเวอร์ไม่สามารถฟังไคลเอนต์อื่นได้สองครั้ง หากคุณต้องการใช้งานคุณต้องใช้แบบอะซิงโครนัสหรือมัลติเธรด * * @author tuzongxun123 * */ แชทคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// ว่าเซิร์ฟเวอร์เริ่มสำเร็จ // ซ็อกเก็ตเซิร์ฟเวอร์เซิร์ฟเวอร์ SS = NULL; // ซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตซ็อกเก็ต = null; // เซิร์ฟเวอร์อ่านข้อมูลลูกค้าอินพุตข้อมูลไคลเอนต์ datainputStream datainputStream = null; ลอง {// เริ่มเซิร์ฟเวอร์ SS = ใหม่ Serversocket (8888); } catch (bindexception e) {system.out.println ("พอร์ตมีการใช้งานแล้ว"); // ปิดโปรแกรมโปรแกรมออก (0); } catch (exception e) {e.printstacktrace (); } ลอง {iSstart = true; ในขณะที่ (iSstart) {boolean isConnect = false; // เริ่มซ็อกเก็ตการฟัง = ss.accept (); System.out.println ("One Client Connect"); isConnect = true; ในขณะที่ (isConnect) {// รับไคลเอนต์อินพุตสตรีม datainputStream = ใหม่ datainputStream (socket.getInputStream ()); // อ่านข้อมูลที่ส่งผ่านโดยข้อความสตริงไคลเอนต์ = datainputStream.readutf (); System.out.println ("ไคลเอนต์พูดว่า:" + ข้อความ); }}} catch (eofexception e) {system.out.println ("ลูกค้าปิด!"); } catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดทรัพยากรที่เกี่ยวข้องลอง {datainputStream.close (); Socket.close (); } catch (ioexception e) {e.printstacktrace (); -ดำเนินการต่อโดยอิงจากการเชื่อมต่อไคลเอนต์เดียวขั้นตอนที่สองที่นี่ต้องใช้การใช้งานการเชื่อมต่อไคลเอนต์หลายรายการซึ่งต้องใช้เธรด เมื่อใดก็ตามที่ไคลเอนต์ใหม่เชื่อมต่อเซิร์ฟเวอร์จะต้องเริ่มเธรดใหม่สำหรับการประมวลผลดังนั้นการแก้ปัญหาการบล็อกในการอ่านลูปก่อนหน้านี้
โดยปกติจะมีสองวิธีในการเขียนเธรด: การรวมเธรดหรือการนำอินเตอร์เฟส Runnable มาใช้ โดยหลักการแล้วหากสามารถใช้งานได้จะไม่ได้รับการสืบทอดเพราะวิธีการใช้อินเทอร์เฟซนั้นมีความยืดหยุ่นมากขึ้น
รหัสไคลเอนต์ไม่เปลี่ยนแปลงเมื่อเทียบกับก่อนและกลายเป็นเซิร์ฟเวอร์ดังนั้นเฉพาะรหัสเซิร์ฟเวอร์ที่โพสต์ที่นี่:
Java ใช้ซ็อกเก็ตและส่วนประกอบ AWT และมัลติเธรดเพื่อใช้เซิร์ฟเวอร์ฟังก์ชั่นการแชทออนไลน์:
หลังจากเชื่อมต่อไคลเอนต์หลายตัวข้อความจะถูกส่งไปยังเซิร์ฟเวอร์อย่างต่อเนื่อง เมื่อเทียบกับเวอร์ชันแรกโฟกัสคือการใช้มัลติเธรด เซิร์ฟเวอร์ยังไม่ได้ใช้ฟังก์ชันการส่งต่อ ลูกค้าสามารถดูข้อมูลที่ป้อนด้วยตัวเองในหน้าต่างกราฟิกเท่านั้นและไม่สามารถดูข้อความที่ส่งโดยลูกค้ารายอื่นได้
แพ็คเกจแชทแชท; นำเข้า java.io.datainputstream; นำเข้า java.io.eofexception; นำเข้า java.io.ioException; นำเข้า java.net.bindexception; นำเข้า java.net.serversocket; นำเข้า java.net.socket; นำเข้า java.net.socketexception; / ** * * * @author tuzongxun123 * */ แชทคลาสสาธารณะ {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {chatserver ใหม่ (). start (); } // ไม่ว่าเซิร์ฟเวอร์จะเริ่มต้นสำเร็จบูลีนส่วนตัว iSstart = false; // เซิร์ฟเวอร์ซ็อกเก็ตเซิร์ฟเวอร์เซิร์ฟเวอร์ส่วนตัว SS = NULL; // ซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตส่วนตัวซ็อกเก็ต = null; โมฆะสาธารณะเริ่มต้น () {ลอง {// เริ่มเซิร์ฟเวอร์ SS = ใหม่ Serversocket (8888); } catch (bindexception e) {system.out.println ("พอร์ตอยู่ในการใช้งาน"); // ปิดโปรแกรมโปรแกรมออก (0); } catch (exception e) {e.printstacktrace (); } ลอง {iSstart = true; ในขณะที่ (iSstart) {// เริ่มฟังซ็อกเก็ต = ss.accept (); System.out.println ("One Client Connect"); // เริ่มไคลเอนต์ไคลเอนต์ไคลเอนต์ลูกค้า = ไคลเอนต์ใหม่ (ซ็อกเก็ต); เธรดใหม่ (ไคลเอนต์). start (); }} catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดบริการลอง {ss.close (); } catch (ioexception e) {e.printstacktrace (); }}} / ** * เธรดไคลเอ็นต์ * * @author tuzongxun123 * * / คลาสไคลเอนต์ใช้งานการรัน {// ซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตส่วนตัวซ็อกเก็ตส่วนตัว = null; // ไคลเอ็นต์อินพุตสตรีมส่วนตัว datainputStream datainputStream = null; บูลีนส่วนตัว isConnect = false; ไคลเอนต์สาธารณะ (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต; ลอง {isConnect = true; // รับไคลเอนต์อินพุตสตรีม datainputStream = ใหม่ datainputStream (socket.getInputStream ()); } catch (ioexception e) {e.printstacktrace (); }} @Override โมฆะสาธารณะเรียกใช้ () {isConnect = true; ลอง {ในขณะที่ (isConnect) {// อ่านข้อมูลที่ส่งผ่านโดยข้อความสตริงไคลเอนต์ = datainputStream.readutf (); System.out.println ("ไคลเอนต์พูดว่า:" + ข้อความ); }} catch (eofexception e) {system.out.println ("ลูกค้าปิด!"); } catch (socketexception e) {system.out.println ("ไคลเอนต์ปิด !!!"); } catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดทรัพยากรที่เกี่ยวข้องลอง {datainputStream.close (); Socket.close (); } catch (ioexception e) {e.printstacktrace (); -ส่วนใหญ่แนะนำฟังก์ชั่นของการใช้เธรดเพื่อให้เซิร์ฟเวอร์รับคำขอหลายไคลเอนต์ ที่นี่ลูกค้าต้องได้รับข้อความหลายไคลเอนต์ในขณะที่ส่งต่อข้อความไปยังไคลเอนต์ที่เชื่อมต่อแต่ละรายการและลูกค้าจะต้องสามารถแสดงในพื้นที่แสดงเนื้อหาเนื้อหาได้
เมื่อใช้การส่งต่อไคลเอนต์ไม่มีอะไรมากไปกว่าการเพิ่มกระแสเอาต์พุต ก่อนหน้านี้ไคลเอนต์ส่ง แต่ไม่ได้รับเท่านั้นดังนั้นจึงจำเป็นต้องเปลี่ยนไคลเอนต์เพื่อรับข้อความเซิร์ฟเวอร์ในลักษณะวงกลมดังนั้นจึงจำเป็นต้องใช้มัลติเธรด
เมื่อนำฟังก์ชั่นนี้มาใช้ฉันโดยบังเอิญว่าฟังก์ชั่นของการสร้างรหัสการตรวจสอบแบบสุ่มดังนั้นฉันจึงมีแรงบันดาลใจอย่างฉับพลันในการสร้างชื่อสำหรับลูกค้าแต่ละรายดังนั้นเมื่อเอาท์พุทมันดูเหมือนการแชทเป็นกลุ่มไม่เพียง แต่มีเอาต์พุตข้อความ แต่ยังสามารถดูว่าใคร
หลังจากใช้ฟังก์ชั่นเหล่านี้คุณสามารถมีการแชทเป็นกลุ่มออนไลน์ในเวลาเดียวกันสำหรับหลาย ๆ คน เนื่องจากมีวิธีการหลักในรหัสคุณสามารถทำให้ทั้งเซิร์ฟเวอร์และไคลเอนต์เป็นแพ็คเกจ JAR ที่เรียกใช้งานได้ คุณสามารถอ้างถึงโพสต์บล็อกอื่นของฉัน: ใช้ Eclipse เพื่อสร้างแพ็คเกจ JAR ที่ใช้งานได้ของโปรแกรม Java
จากนั้นดับเบิลคลิกที่ไฟล์ JAR ที่เกี่ยวข้องบนเดสก์ท็อปเพื่อเริ่มต้นเซิร์ฟเวอร์และไคลเอนต์และคุณไม่จำเป็นต้องพึ่งพา Eclipse อีกต่อไป
รหัสไคลเอนต์ที่แก้ไขมีดังนี้:
แพ็คเกจแชทแชท; นำเข้า Java.awt.BorderLayout; นำเข้า java.awt.frame; นำเข้า Java.awt.TextArea; นำเข้า Java.awt.TextField; นำเข้า java.awt.event.actionEvent; นำเข้า java.awt.event.actionListener; นำเข้า java.awt.event.windowadapter; นำเข้า java.awt.event.windowevent; นำเข้า java.io.datainputstream; นำเข้า Java.io.DataOutputStream; นำเข้า java.io.ioException; นำเข้า java.net.socket; นำเข้า java.net.unknownhostexception; นำเข้า java.util.random; /** * ขั้นตอนการแชทออนไลน์ขั้นตอน: * 1 สร้างโครงร่างอินเตอร์เฟสหน้าต่างกราฟิก*2 เพิ่มเหตุการณ์ปิดสำหรับโครงร่าง*3 เพิ่มพื้นที่อินพุตและพื้นที่แสดงเนื้อหาในโครงร่าง*4 เพิ่มเหตุการณ์การส่งคืนรถสำหรับพื้นที่อินพุต*5 สร้างการเชื่อมต่อเซิร์ฟเวอร์และส่งข้อมูล * * @author tuzongxun123 * * */ คลาสสาธารณะแชทไคลเอนต์ขยายเฟรม {/ ** * */ ส่วนตัวคงที่สุดท้ายสุดท้าย serialversionuid = 1l; // พื้นที่ผู้ใช้อินพุตส่วนตัว textfield tftxt = new TextField (); // การแสดงเนื้อหาพื้นที่ textarea ส่วนตัว taste = new textarea (); ซ็อกเก็ตซ็อกเก็ตส่วนตัว = null; // การส่งออกข้อมูล Data DataOutputStream DataOutputStream = NULL; // การป้อนข้อมูลข้อมูลสตรีม Private DatainputStream DatainputStream = null; บูลีนส่วนตัว isConnect = false; เธรด treceive = เธรดใหม่ (ใหม่รับรีเมทรีด ()); ชื่อสตริง = ""; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {chatclient chatclient = new chatclient (); chatclient.createname (); chatclient.launcframe (); } / ** * สร้างหน้าต่างกราฟิกง่าย ๆ * * @author: tuzongxun * @title: launcframe * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:00 am * @throws * / โมฆะสาธารณะ launcframe () {setLocation (300, 200); this.setsize (200, 400); เพิ่ม (tftxt, borderlayout.south); เพิ่ม (Tarea, Borderlayout.north); // กำหนดขนาดที่เหมาะสมของเฟรมตามเค้าโครงในหน้าต่างและ PreferredSize ของชุดส่วนประกอบ (); // ฟังเหตุการณ์การปิดของหน้าต่างอินเตอร์เฟสกราฟิก this.addWindowListener (ใหม่ windowAdapter () {@Override โมฆะสาธารณะ windowclosing (windowEvent e) {system.exit (0); disconnect ();}}); tftxt.addactionListener (ใหม่ tflister ()); // ตั้งค่าหน้าต่างเพื่อดู setVisible (จริง); เชื่อมต่อ(); // เริ่มเธรดที่ยอมรับข้อความ treceive.start (); } / ** * เชื่อมต่อกับเซิร์ฟเวอร์ * * @author: tuzongxun * @title: เชื่อมต่อ * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:56:49 am * @throws * / โมฆะสาธารณะเชื่อมต่อ () {ลอง {// // รับสตรีมเอาต์พุตไคลเอ็นต์ DataOutputStream = ใหม่ dataOrmputStream (socket.get.getOutputStream ()); datainputStream = ใหม่ datainputStream (socket.getInputStream ()); System.out.println ("เชื่อมต่อกับเซิร์ฟเวอร์"); isConnect = true; } catch (unknownhostexception e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); }} // สร้างชื่อไคลเอนต์แบบสุ่มโมฆะสาธารณะ createName () {string [] str1 = {"," b "," c "," d "," e "," f "," g "," h "," i "," j "," k "," l "," m "," "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "d", ",", " "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; สุ่มวิ่ง = ใหม่สุ่ม (); สำหรับ (int i = 0; i <6; i ++) {// long num = math.round (math.random () * (str1.length - 0)+0); // int n = (int) num; int n = ran.nextint (str1.length); if (n <str1.length) {string str = str1 [n]; ชื่อ = ชื่อ + str; System.out.println (ชื่อ); } else {i--; ดำเนินการต่อ; }} this.settitle (ชื่อ); } / ** * ปิดแหล่งข้อมูลลูกค้า * * @author: tuzongxun * @title: disconnect * @param * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:46 am * @throws * / โมฆะสาธารณะ disconnect () {ลอง {isconnect = false; // หยุดเธรด treceive.oin (); } catch (interruptedException e) {e.printStackTrace (); } ในที่สุด {ลอง {if (dataOutputStream! = null) {dataOrtputStream.close (); } if (ซ็อกเก็ต! = null) {socket.close (); ซ็อกเก็ต = null; }} catch (ioexception e) {e.printstacktrace (); }}} / ** * ส่งข้อความไปยังเซิร์ฟเวอร์ * * @author: tuzongxun * @title: sendmessage * @param @param text * @return เป็นโมฆะ * @date 18 พฤษภาคม 2016 9:57:56 am * @throws * / void ส่วนตัว dataOrtputStream.flush (); } catch (ioexception e1) {e1.printstacktrace (); }} / ** * อินพุตหน้าต่างกราฟิกการฟังการรับส่งคืนเหตุการณ์ * * @author tuzongxun123 * * / คลาสส่วนตัว tflister ใช้ ActionListener {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {String text = tftxt.getText (). trim (); // ล้างข้อมูลพื้นที่อินพุต tftxt.settext (""); // ส่งข้อมูลไปยังเซิร์ฟเวอร์หลังจากกด Carriage ไปยัง SendMessage (ข้อความ); }} คลาสส่วนตัวที่รับการดำเนินการใช้งาน runnable {@Override public void run () {ลอง {ในขณะที่ (isConnect) {String message = datainputStream.readutf (); System.out.println (ข้อความ); String txt = taxa.getText (); if (txt! = null &&! "". equals (txt.trim ())) {message = taxa.getText () + "/n" + ข้อความ; } taxa.settext (ข้อความ); }} catch (ioexception e) {e.printstacktrace (); - รหัสเซิร์ฟเวอร์ที่แก้ไขมีดังนี้:
แพ็คเกจแชทแชท; นำเข้า java.io.datainputstream; นำเข้า Java.io.DataOutputStream; นำเข้า java.io.eofexception; นำเข้า java.io.ioException; นำเข้า java.net.bindexception; นำเข้า java.net.serversocket; นำเข้า java.net.socket; นำเข้า java.net.socketexception; นำเข้า java.util.arraylist; นำเข้า java.util.list; /** * Java ใช้ซ็อกเก็ตและส่วนประกอบ AWT และมัลติเธรดเพื่อใช้เซิร์ฟเวอร์ฟังก์ชั่นการแชทออนไลน์: * เซิร์ฟเวอร์ใช้ข้อมูลที่ได้รับข้อมูลไคลเอนต์ที่ได้รับจะถูกส่งต่อไปยังไคลเอนต์ที่เชื่อมต่อทั้งหมดและอนุญาตให้ลูกค้าอ่านข้อมูลนี้และแสดงในพื้นที่แสดงเนื้อหา * * @author tuzongxun123 * */ แชทคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {chatserver ใหม่ (). start (); } // ไม่ว่าเซิร์ฟเวอร์จะเริ่มต้นบูลีนส่วนตัว iSstart = false ได้สำเร็จหรือไม่ // เซิร์ฟเวอร์ซ็อกเก็ตเซิร์ฟเวอร์เซิร์ฟเวอร์ส่วนตัว SS = NULL; // ซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตส่วนตัวซ็อกเก็ต = null; // บันทึกรายการคอลเลกชันไคลเอนต์ <client> clients = new ArrayList <Client> (); โมฆะสาธารณะเริ่มต้น () {ลอง {// เริ่มเซิร์ฟเวอร์ SS = ใหม่ Serversocket (8888); } catch (bindexception e) {system.out.println ("พอร์ตอยู่ในการใช้งาน"); // ปิดโปรแกรมโปรแกรมออก (0); } catch (exception e) {e.printstacktrace (); } ลอง {iSstart = true; ในขณะที่ (iSstart) {// เริ่มซ็อกเก็ตการฟัง = ss.accept (); System.out.println ("One Client Connect"); // เริ่มไคลเอนต์ไคลเอนต์ไคลเอนต์ลูกค้า = ไคลเอนต์ใหม่ (ซ็อกเก็ต); เธรดใหม่ (ไคลเอนต์). start (); clients.add (ลูกค้า); }} catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดบริการลอง {ss.close (); } catch (ioexception e) {e.printstacktrace (); }}} / ** * เธรดไคลเอนต์ * * @author tuzongxun123 * * / ไคลเอนต์คลาสส่วนตัวใช้งานการรัน {// ซ็อกเก็ตซ็อกเก็ตซ็อกเก็ตส่วนตัวซ็อกเก็ตส่วนตัว = null; // ไคลเอ็นต์อินพุตสตรีมส่วนตัว datainputStream datainputStream = null; // ไคลเอ็นต์เอาท์พุทสตรีม Private DataOutputStream DataOutputStream = NULL; บูลีนส่วนตัว isConnect = false; ไคลเอนต์สาธารณะ (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต; ลอง {isConnect = true; // รับไคลเอนต์อินพุตสตรีม datainputStream = ใหม่ datainputStream (socket.getInputStream ()); // รับสตรีมเอาต์พุตไคลเอ็นต์ DataOutputStream = ใหม่ dataOrmputStream (socket.get.getOutputStream ()); } catch (ioexception e) {e.printstacktrace (); }} / ** * ส่งข้อมูลจำนวนมาก (ส่งต่อ) ไปยังไคลเอนต์ * * @author: tuzongxun * @title: sendmessagetoclients * @param @param ข้อความ * @return เป็นโมฆะ * @date พฤษภาคม 2016 11:28:10 Am * @throws * } catch (socketexception e) {} catch (ioexception e) {e.printstacktrace (); }} @Override โมฆะสาธารณะเรียกใช้ () {isConnect = true; ไคลเอนต์ c = null; ลอง {ในขณะที่ (isConnect) {// อ่านข้อมูลที่ส่งผ่านโดยข้อความสตริงไคลเอนต์ = datainputStream.readutf (); System.out.println ("ลูกค้าบอกว่า:" + ข้อความ); สำหรับ (int i = 0; i <clients.size (); i ++) {c = clients.get (i); C.SendMessagetoclient (ข้อความ); }}} catch (eofexception e) {system.out.println ("ลูกค้าปิด!"); } catch (socketexception e) {ถ้า (c! = null) {client.remove (c); } system.out.println ("ไคลเอนต์ปิด !!!"); } catch (exception e) {e.printstacktrace (); } ในที่สุด {// ปิดทรัพยากรที่เกี่ยวข้องลองลอง {if (datainputStream! = null) {datainputStream.close (); } if (ซ็อกเก็ต! = null) {socket.close (); ซ็อกเก็ต = null; }} catch (ioexception e) {e.printstacktrace (); -มาแนะนำให้คุณทราบก่อนแล้วอัปเดตให้คุณหากมีเนื้อหาใหม่
เกี่ยวกับการรับรู้ของฟังก์ชั่นการแชทออนไลน์ของเว็บคุณสามารถอ้างอิงบทความต่อไปนี้เพื่อการเรียนรู้:
Java ใช้การแชร์ฟังก์ชั่นการแชท TCPSocket อย่างง่าย
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าคุณจะสามารถให้ความสนใจกับเนื้อหาที่น่าตื่นเต้นมากขึ้นจาก Wulin.com