เมื่อเร็ว ๆ นี้ฉันไม่ได้ใช้งานมากและได้ใช้เวลาในการตรวจสอบแอปพลิเคชันทางเทคนิคของ Java
วันนี้ฉันไม่มีอะไรทำ จากโปรโตคอล UDP ฉันเขียนโปรแกรมห้องสนทนาที่ง่ายมาก
ในงานปัจจุบันของฉันซ็อกเก็ตไม่ค่อยได้ใช้ซึ่งเป็นหน่วยความจำง่าย ๆ ของการเขียนโปรแกรมเครือข่าย Java
มาดูเอฟเฟกต์กันเถอะ:
ผลของการดำเนินการอาจกล่าวได้ว่าง่ายมาก แต่คุณยังสามารถเห็นหลักการดำเนินการได้
ผู้ใช้ "ห้องแชท 001" Xiaohong และ Xiaolu คุยกันสองสามคำและ Xiaohei จาก "Chat Room 002" ไม่สนใจเขาและเหงา
ดูการใช้งานรหัส:
1. ก่อนอื่นการใช้งานเซิร์ฟเวอร์ข้อความฟังก์ชั่นนั้นง่ายมาก:
•ลงทะเบียนข้อมูลของลูกค้า (ห้องแชทที่คุณป้อน ฯลฯ );
•สร้างวัตถุซ็อกเก็ตโปรโตคอล UDP เพื่อรับข้อความที่ส่งโดยลูกค้าแต่ละราย
•วิเคราะห์เนื้อหาข้อความและส่งข้อมูลการแชทกลับไปยังลูกค้าแต่ละรายในห้องแชทที่เกี่ยวข้อง
แพ็คเกจ com.tsr.simplechat.receive_server; นำเข้า java.io.ioexception; นำเข้า java.net.datagrampacket; นำเข้า java.net.datagramsocket นำเข้า java.net.socketexception; com.tsr.simplechat.bean.messageentity; นำเข้า com.tsr.simplechat.client.chatclient; // แชทเซิร์ฟเวอร์คลาสสาธารณะแชทเซิร์ฟเวอร์ขยายเธรด {// โปรแกรมใช้หมายเลขพอร์ตส่วนตัว // ข้อความยอมรับ Socket Object DataGramsocket Server = NULL; // วัตถุพจนานุกรม (คีย์: รหัสห้องแชทค่า: ชุดของผู้ใช้ลูกค้าภายใต้ห้องแชทนี้); HashMap แบบคงที่ส่วนตัว <String, ArrayList <ChatClient>> กลุ่ม = new HashMap <String, ArrayList <ChatClient>> (); // constructor public chatserver () {ลอง {// ข้อความยอมรับการเริ่มต้นโครงสร้างการเริ่มต้นของ Socket Object Server = DataGramSocket ใหม่ (พอร์ต); } catch (socketexception e) {e.printstacktrace (); }} // ลงทะเบียนผู้ใช้ล็อกอินใหม่ในห้องแชทโมฆะสาธารณะ LoGingRoup (String GroupID, ChatClient Client) {// รับผู้ใช้ออนไลน์ทั้งหมดของห้องแชทผ่านห้องแชท arraylist <HatClient> clients = Groups.get (GroupId); if (clients == null) {clients = new ArrayList <HatClient> (); } // ลงทะเบียนผู้ใช้ที่เข้าห้องแชทคราวนี้ client.add (ไคลเอนต์); // อัปเดตข้อมูลห้องแชทกลุ่มข้อมูล (GroupID, ไคลเอนต์); } // รับข้อความ @Override โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {texiveMessage (); }} void private void teceiveMessage () {// UDP Packet Byte [] buf = byte ใหม่ [1024]; DataGampacket Packet = DataGampacket ใหม่ (buf, buf.length); ในขณะที่ (จริง) {ลอง {// ยอมรับแพ็กเก็ตเซิร์ฟเวอร์ receive (แพ็คเก็ต); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); } // แยกวิเคราะห์แพ็คเก็ตข้อมูลและรับข้อมูลสตริงข้อมูลแชท = สตริงใหม่ (packet.getData (), 0, packet.getLength ()); // แยกวิเคราะห์ข้อมูล JSON ผ่านแพ็คเกจบุคคลที่สาม GSON GSON = new GSON (); MessageEntity me = gson.fromjson (เนื้อหา, messageEntity.class); // แยกวิเคราะห์เนื้อหาข้อความและรับผู้ใช้ออนไลน์ทั้งหมดของห้องแชทผ่าน ID ห้องแชท arraylist <HatClient> clients = groups.get (me.getGroupId ()); // ส่งข้อความที่ได้รับกลับไปยังผู้ใช้แต่ละคนของห้องแชทสำหรับ (ไคลเอนต์แชทไคลเอนต์: ไคลเอนต์) {client.pushbackMessage (ฉัน); -2. โปรแกรมลูกค้ายังคงง่ายมาก:
•กำหนดอินเทอร์เฟซห้องแชทของไคลเอนต์อย่างง่ายดาย
•สร้างข้อความส่งข้อความซ็อกเก็ต
•รับเนื้อหาของกล่องข้อมูลแชทและส่งไปยังเซิร์ฟเวอร์
แพ็คเกจ com.tsr.simplechat.client; นำเข้า java.awt.button; นำเข้า java.awt.event; นำเข้า java.awt.frame; นำเข้า java.awt.TextArea; นำเข้า java.awt.Textfield; java.io.ioexception; นำเข้า java.net.datagrampacket; นำเข้า java.net.datagramsocket; นำเข้า java.net.inetaddress; นำเข้า java.net.socketexception; นำเข้า Java.net.unknownhostexception; com.tsr.simplechat.receive_server.chatserver; // โปรแกรมไคลเอ็นต์คลาสสาธารณะแชทแชทขยายเฟรม {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; // แชทห้อง ID สตริงส่วนตัว GroupID; // ไคลเอนต์ชื่อผู้ใช้ส่วนตัวสตริงชื่อไคลเอนต์; // ข้อความไคลเอนต์ส่งซ็อกเก็ตส่วนตัว DataGramsocket MSG_SEND; // พอร์ตบริการพอร์ต INT สุดท้ายส่วนตัว = 10,000; // ที่อยู่ IP ของเซิร์ฟเวอร์ INTADDRESS ส่วนตัว IP; // การควบคุมไคลเอ็นต์ TextField TF = New TextField (20); textarea ta = textarea ใหม่ (); ปุ่มส่ง = ปุ่มใหม่ ("ส่ง"); // ไคลเอนต์คอนสตรัคเตอร์แชทสาธารณะ (String GroupID, String clientName) {super ("ห้องแชท:" + GroupId + "/" + ชื่อไคลเอนต์); this.clientName = clientName; this.groupid = GroupId; // ตั้งค่าสไตล์อินเทอร์เฟซไคลเอนต์เพิ่ม ("North", TF); เพิ่ม ("center", ta); เพิ่ม ("ใต้", ส่ง); setsize (250, 250); แสดง(); // เริ่มต้น init () สำหรับเซิร์ฟเวอร์ที่เกี่ยวข้องกับการแชท; // ตรวจสอบ addWindowListener (ใหม่ windowAdapter () {โมฆะสาธารณะ windowclosing (windowevent e) {// ปิดข้อความส่งข้อความบริการ msg_send.close (); // ปิดโปรแกรมไคลเอ็นต์กำจัด (); system.exit (0);}}); } // เริ่มต้นช่องว่างส่วนตัวเริ่มต้น () {// ลงทะเบียนข้อมูลผู้ใช้ปัจจุบันและห้องสนทนาไปยังเซิร์ฟเวอร์แชทเซิร์ฟเวอร์ LogingRoup (GroupID, นี่); ลอง {// เริ่มต้นข้อความที่ส่งออบเจ็กต์ซ็อกเก็ต msg_send = ใหม่ datagramsocket (); // ระบุเซิร์ฟเวอร์ข้อความลอง {ip = inetAddress.getByName ("127.0.0.1"); } catch (unknownhostexception e) {system.out.println ("UnknownHostException .. "); }} catch (socketexception e) {system.out.println ("ข้อยกเว้นการเชื่อมต่อซ็อกเก็ต .. "); }} // ข้อความส่งข้อความเวลาการฟังการกระทำบูลีนสาธารณะ (เหตุการณ์ evt, arg object) {ถ้า (evt.target.equals (ส่ง)) {ลอง {// รับอินพุตเนื้อหาสตริงเนื้อหา = tf.getText (); // ส่งข้อความ send_message (เนื้อหา); // ล้างกล่องแชท tf.settext (null); } catch (ข้อยกเว้น ioe) {system.out.print (ioe.getMessage ()); }} ส่งคืนจริง; } // ส่งข้อความเป็นโมฆะส่วนตัว send_message (เนื้อหาสตริง) {// รูปแบบข้อความ (รูปแบบ JSON) สตริงข้อความ = MessageFormat (เนื้อหา); // ห่อหุ้มข้อความลงใน UDP Packet byte [] buf = message.getBytes (); DataGrampacket Packet = DataGampacket ใหม่ (buf, buf.length, IP, พอร์ต); ลอง {// ส่งข้อความ msg_send.send (แพ็คเก็ต); } catch (ioexception e) {system.out.println ("ข้อยกเว้น io .. "); }} // การจัดรูปแบบข้อความการจัดรูปแบบส่วนตัว String MessageFormat (เนื้อหาสตริง) {StringBuffer buffer = new StringBuffer (); buffer.append ("{/" groupId/":") ผนวก ("/" "). ผนวก (GroupId) .append ("/","); buffer.append ("/" ชื่อผู้ใช้/":/"). ผนวก (ชื่อไคลเอนต์) .append ("/", "); buffer.append ("/"ข้อความ/":/"). ผนวก (เนื้อหา) .append ("/"}"); return buffer.toString (); } // รับข่าวล่าสุดของห้องแชทปัจจุบันจากเซิร์ฟเวอร์ (โทรกลับ .. ) โมฆะสาธารณะ pushbackMessage (ข้อความฉัน) {ta.append (me.getUserName () + ":" + me.getText ()); ta.append ("/n"); - 3. คลาสเอนทิตีข้อความ <br /> ส่วนใหญ่จะใช้เพื่อห่อหุ้มข้อความลงในวัตถุรวมถึง: รหัสห้องแชทชื่อเล่นผู้ส่งข้อความและเนื้อหาข้อความ ใช้รูปแบบ JSON เพื่อแยกวิเคราะห์
แพ็คเกจ com.tsr.simplechat.bean; // ข้อความ Entity Public Class MessageEntity {Private String GroupID; ชื่อผู้ใช้สตริงส่วนตัว; ข้อความสตริงส่วนตัว สตริงสาธารณะ getGroupId () {return groupId; } โมฆะสาธารณะ setGroupId (String GroupID) {this.groupId = GroupId; } สตริงสาธารณะ getUserName () {ส่งคืนชื่อผู้ใช้; } โมฆะสาธารณะ setUserName (ชื่อผู้ใช้สตริง) {this.userName = ชื่อผู้ใช้; } สตริงสาธารณะ getText () {ส่งคืนข้อความ; } โมฆะสาธารณะ setText (ข้อความสตริง) {this.text = text; -4. ตกลงมันทำโดยทั่วไปที่นี่และสร้างคลาสทดสอบ
•เปิดเซิร์ฟเวอร์ข้อความ
•เปิดลูกค้าสามรายซึ่งสองคนเข้าสู่ "ห้องแชท 001" และอีกคนเข้าสู่ "ห้องแชท 002"
นำเข้า com.tsr.simplechat.client.chatclient; นำเข้า com.tsr.simplechat.receive_server.chatserver; การทดสอบระดับสาธารณะ {โมฆะสาธารณะคง R.Start (); chatclient c1 = chatclient ใหม่ ("001", "Little Red"); chatclient c2 = chatclient ใหม่ ("001", "Little Green"); chatclient c3 = chatclient ใหม่ ("002", "Little Black"); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น