บทความนี้แบ่งปันฟังก์ชั่นแชทกลุ่ม Java สำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
การสนับสนุน Java สำหรับโปรโตคอล TCP:
-> แพ็คเกจ java.net กำหนดสองคลาส Serversocket และซ็อกเก็ตซึ่งใช้ในการใช้การเชื่อมต่อแบบสองทิศทางตามลำดับ
-> คลาสไคลเอนต์กำหนดไคลเอนต์
แพ็คเกจ com.dragon.java.tcpchat; นำเข้า java.io.ioexception; นำเข้า java.net.socket; นำเข้า java.net.unknownhostexception;/** * ลูกค้า * * @author auser * */ลูกค้าชั้นเรียนสาธารณะ ซ็อกเก็ต ("192.168.1.188", 10,000); // เธรดที่ส่งข้อมูลผ่านไคลเอนต์ใหม่ (ไคลเอนต์). start (); // สร้างเธรดที่ได้รับข้อมูลลูกค้าใหม่ (ไคลเอนต์). start (); // เนื่องจากคุณต้องการใช้ฟังก์ชั่นการแชทแทนการส่งข้อมูลเพียงครั้งเดียวเท่านั้นไม่สามารถปิดสตรีมเอาท์พุทหรือไคลเอนต์ได้ // client.shutdownoutput (); // client.close (); --> clientend class กำหนดเธรดที่ไคลเอนต์ส่งข้อมูลไปยังเซิร์ฟเวอร์
แพ็คเกจ com.dragon.java.tcpchat; นำเข้า java.io.ioexception; นำเข้า java.io.printstream; นำเข้า java.net.socket; นำเข้า java.util.scanner;/** * เธรดที่ลูกค้าส่งข้อมูลไปยังเซิร์ฟเวอร์ * * @author auser */ไคลเอนต์ ซ็อกเก็ตซ็อกเก็ตส่วนตัว ลูกค้าสาธารณะ (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต; } @Override โมฆะสาธารณะ Run () {Scanner = ใหม่สแกนเนอร์ (System.in); ลอง {printstream ps = printstream ใหม่ (socket.getOutputStream ()); สตริงบรรทัด = ""; // การปิดกั้นข้อมูลการส่งในขณะที่ ((line = scanner.nextline ())! = null) {ps.println (บรรทัด); }} catch (ioexception e) {e.printstacktrace (); --> คลาส clientReceive กำหนดเธรดที่ไคลเอนต์ได้รับข้อมูลเซิร์ฟเวอร์
แพ็คเกจ com.dragon.java.tcpchat; นำเข้า java.io.bufferedreader; นำเข้า java.io.inputStreamreader; นำเข้า java.net.socket;/** * เธรดบนลูกค้าที่ได้รับข้อมูล * * @author Auser * * Public ClientReceive (ซ็อกเก็ตซ็อกเก็ต) {this.socket = ซ็อกเก็ต; } @Override โมฆะสาธารณะเรียกใช้ () {ลอง {bufferedReader br = ใหม่ bufferedReader (ใหม่ inputStreamReader (socket.get.getInputStream ())); // รับข้อมูลโดยสายสายบรรทัด = ""; ในขณะที่ ((line = br.readline ())! = null) {system.out.println (บรรทัด); }} catch (exception e) {e.printstacktrace (); --> เซิร์ฟเวอร์นิยามคลาสเซิร์ฟเวอร์
แพ็คเกจ com.dragon.java.tcpchat; นำเข้า java.io.ioexception; นำเข้า java.net.serversocket; นำเข้า java.net.socket นำเข้า java.util.arraylist; นำเข้า java.util.list;/** * IOException, interruptedException {list <socket> list = new ArrayList <> (); // สร้างซ็อกเก็ตเซิร์ฟเวอร์ซ็อกเก็ตเซิร์ฟเวอร์เซิร์ฟเวอร์ = ใหม่ Serversocket (10,000); ในขณะที่ (จริง) {// วิธีการปิดกั้นการรับซ็อกเก็ตซ็อกเก็ตไคลเอนต์ = server.accept (); // การออกแบบหลายเธรดที่อาจเพิ่มหรือลบชุด, ซิงโครไนซ์ (รายการ) {list.add (ซ็อกเก็ต); } // เริ่มเธรดใหม่เพื่อจัดการกับการสื่อสารของไคลเอนต์ใหม่นี้ Handlesocket (ซ็อกเก็ต, รายการ). start (); } // เนื่องจากคุณไม่ทราบว่าเมื่อใดที่ไคลเอนต์ส่งข้อมูลเซิร์ฟเวอร์จะต้องเปิดและไม่สามารถปิดได้ --> คลาส Handlesocket ทำงานบนไคลเอนต์ที่เชื่อมต่อกับเซิร์ฟเวอร์ (การแจ้งเตือนบนและออฟไลน์การปิดกั้นและการแบล็กเมล์ส่งข้อมูลไปยังไคลเอนต์แต่ละตัว ฯลฯ )
แพ็คเกจ com.dragon.java.tcpchat; นำเข้า java.io.bufferedreader; นำเข้า java.io.ioexception; นำเข้า java.io.inputstreamreader; นำเข้า java.io.printstream; นำเข้า java.net.inetaddress; ซ็อกเก็ตซ็อกเก็ต; รายการส่วนตัว <ซ็อกเก็ต> รายการ; / *** Constructor** @param Socket* ไคลเอ็นต์ที่เชื่อมต่ออยู่ในปัจจุบัน* @param List* คอลเลกชันของไคลเอนต์ที่เชื่อมต่อที่เก็บไว้*/ Public Handlesocket (ซ็อกเก็ตซ็อกเก็ต, รายการ <ซ็อกเก็ต> รายการ) {this.socket = ซ็อกเก็ต; this.list = list; } / *** เมธอดรันเธรด* / @Override โมฆะสาธารณะเรียกใช้ () {ที่อยู่ inetAddress = socket.getInetAddress (); // รับที่อยู่ของไคลเอนต์ที่เชื่อมต่อกับสตริงเซิร์ฟเวอร์ ip = address.getHostaddress (); System.out.println (ip + "ไปออนไลน์กันเถอะ!"); if (ip.equals ("192.168.1.117")) {ซิงโครไนซ์ (รายการ) {sendtoall (ip + "Blacklisted เนื่องจากการละเมิด!"); list.remove (ซ็อกเก็ต); } กลับ; } ลอง {bufferedReader br = new bufferedReader (ใหม่ inputStreamReader (socket.getInputStream (), "GBK")); สตริงบรรทัด = ""; ในขณะที่ ((line = br.readline ())! = null) {string msg = ip + ":" + line; System.out.println (msg); // เอาต์พุตไปยังคอนโซลเซิร์ฟเวอร์ // ส่งสิ่งที่ไคลเอนต์นี้บอกกับลูกค้าอื่น ๆ ทั้งหมด sendtoall (msg); }} catch (ioexception e) {// e.printstacktrace (); System.out.println (IP + "Offlined!"); ซิงโครไนซ์ (รายการ) {list.remove (ซ็อกเก็ต); }}} / ** * ส่งข้อมูลไปยังไคลเอนต์ทั้งหมดและลบซ็อกเก็ตปัจจุบัน * * @param msg * ข้อมูลที่ส่งโดย * / โมฆะส่วนตัว sendtoall (สตริงผงชูรส) {ซิงโครไนซ์ (รายการ) {สำหรับ (socket s: list) {if (s! = socket) {ลอง {printstream ps = new printstream ps.println (); } catch (ioexception e) {e.printstacktrace (); - -> หมายเหตุ: เนื่องจากเพื่อให้ไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์นั่นคือไคลเอนต์ต้องค้นหาเซิร์ฟเวอร์ก่อนดังนั้นเซิร์ฟเวอร์จะต้องเปิดใช้งานก่อนแล้วเซิร์ฟเวอร์ ...
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น