ในบทความก่อนหน้านี้การเขียนโปรแกรมห้องแชท Java Socket (1) การใช้ซ็อกเก็ตเพื่อใช้การกดข้อความแชทเราได้พูดคุยเกี่ยวกับวิธีการใช้ซ็อกเก็ตเพื่อให้ข้อความผ่านระหว่างเซิร์ฟเวอร์และไคลเอนต์เพื่อให้บรรลุวัตถุประสงค์ในการผลักดันข้อความ ต่อไปฉันจะเขียนเกี่ยวกับวิธีการเปิดใช้งานเซิร์ฟเวอร์เพื่อสร้างการสื่อสารระหว่างไคลเอนต์และไคลเอนต์
ในความเป็นจริงมันคือการสร้างการสื่อสารการแชทแบบหนึ่งต่อหนึ่ง
มันค่อนข้างแตกต่างจากรหัสก่อนหน้านี้ที่ใช้การกดข้อความและมันได้รับการแก้ไข
หากวิธีการหรือคลาสไม่ได้กล่าวถึงพวกเขาจะเหมือนกับในบทความก่อนหน้า
1. แก้ไขคลาสเอนทิตี (คลาสเอนทิตีบนเซิร์ฟเวอร์และไคลเอนต์เหมือนกัน)
1. ตารางข้อมูลผู้ใช้ userinfobean
ผู้ใช้ระดับสาธารณะ userInfobean ใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 2L; Private Long UserId; // idprivate string username; // ชื่อผู้ใช้สตริงส่วนตัว likename; // ชื่อเล่นสตริงส่วนตัว userpwd; // รหัสผ่านส่วนตัวของผู้ใช้สตริงส่วนตัว usericon;2. ตารางข้อมูลการแชท MessageBean
ข้อความสาธารณะ MessageBean ดำเนินการ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1l; ข้อความยาวส่วนตัว; // ข้อความ idprivate long groupId; // กลุ่ม idprivate บูลีน isgoup; // ไม่ว่าจะเป็นกลุ่มข้อความส่วนตัว เนื้อหาสตริงส่วนตัว errormsg; // ข้อความแสดงข้อผิดพลาดส่วนตัว int errorcode; // รหัสข้อผิดพลาดรหัสส่วนตัว int userId; // ผู้ใช้ idprivate int friendid; // เพื่อนเป้าหมาย idprivate messageFileBean chatfile; // ข้อความที่แนบมา3. MessageFileBean Message Attachment Table
Public Class MessageFileBean ใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 3L; private int fileID; // ไฟล์ idprivate สตริงชื่อไฟล์; // ชื่อไฟล์ความยาว filelength ส่วนตัว; // ความยาวไฟล์ไบต์ส่วนตัว [] filebyte;2. (การปรับเปลี่ยนรหัสด้านเซิร์ฟเวอร์) คลาสบริการแชทหลักของแชทเซิร์ฟเวอร์แก้ไขแก้ไข
การแชทคลาสสาธารณะ {// ซ็อกเก็ตบริการเซิร์ฟเวอร์เซิร์ฟเวอร์สแตติกส่วนตัวส่วนตัว; // ใช้ arraylist เพื่อจัดเก็บรายการซ็อกเก็ตสาธารณะทั้งหมด <ซ็อกเก็ต> ซ็อกเก็ตลิสต์ = arrayList ใหม่ <> (); // เลียนแบบแผนที่ซ็อกเก็ตบัณฑิต <Integer, ซ็อกเก็ต> ซ็อกเก็ต ใหม่ hashmap (); public gson gson = new gson ();/*** เริ่มต้นบริการซ็อกเก็ต*/โมฆะสาธารณะ initserver () {ลอง {// สร้างเซิร์ฟเวอร์เพื่อฟังคำขอของลูกค้าบนพอร์ต 8080 เซิร์ฟเวอร์ = Serversocket ใหม่ blocke.printstacktrace ();}}/*** สร้างการจัดการข้อความและรับข้อความ*/โมฆะส่วนตัว createMessage () {ลอง {system.out.println ("รอการเข้าถึงผู้ใช้:"); // ใช้การยอมรับ socketlist.add (ซ็อกเก็ต); system.out.println ("การเข้าถึงผู้ใช้:" + socket.getport ()); // เปิดเธรดเด็กเพื่อรอซ็อกเก็ตอื่นเพื่อเข้าร่วมเธรดใหม่ รับข้อมูลจากไคลเอนต์ bufferedreader bff = new bufferedReader (ใหม่ inputStreamReader (socket.getInputStream ())); // อ่านสายข้อมูลเซิร์ฟเวอร์ที่ส่งไว้บรรทัด = null; // การวนซ้ำเพื่อรับข้อความจากซ็อกเก็ตปัจจุบันในขณะที่ (จริง) {thread.sleep (500); bff.readline ())! = null) {// แยกวิเคราะห์ messagebean entity class messagebean = gson.fromjson (บรรทัด, messagebean.class); // เพิ่มข้อมูลผู้ใช้ลงในแผนที่เลียนแบบลงในฐานข้อมูลและหน่วยความจำ // คลาสเอนทิตีถูกเก็บไว้ในฐานข้อมูล ID ผู้ใช้ถูกใช้เป็นอ้างอิง setChatMap (MessageBean, ซ็อกเก็ต); // ส่งต่อข้อความที่ผู้ใช้ส่งไปยังเพื่อนเป้าหมาย GetFriend (MessageBean); System.out.println ("ผู้ใช้:" + usermap.get (MessageBean.getUserId () server.close ();} catch (Exception e) {// toDo catch ที่สร้างขึ้นอัตโนมัติ block.printstacktrace (); system.out.println ("ข้อผิดพลาด:" + e.getMessage ());}}/*** ส่งข้อความ*/การรันใหม่ {// ป้อน bufferedReader จากคอนโซล strin = ใหม่ bufferedReader (ใหม่ inputStreamReader (system.in)) buffer = strin.readline (); // เพราะ readline ใช้บรรทัดใหม่เป็นจุดสิ้นสุด เอาท์พุท = socket.getOutputStream (); output.write (buffer.getBytes ("UTF-8")); // ส่ง data output.flush ();}}} catch (ioexception e) {// toDo to-goCe หน่วยความจำ** @param messagebean* @param scoket*/โมฆะส่วนตัว setChatMap (MessageBean MessageBean, Socket Scoket) {// บันทึกข้อมูลผู้ใช้ถ้า (usermap! = null && usermap.get (MessageBean.getUserId () == null) getUserInfobean (messageBean.getUserId ()));} // บันทึกซ็อกเก็ตที่เชื่อมโยงที่สอดคล้องกันถ้า (socketmap! = null && socketmap.get (messageBean.getUserId ()) == null) {socketMap.put ที่นี่** @param userId* @return*/private userinfobean getUserInfobean (int userId) {userInfobean userInfobean = ใหม่ userInfobean (); userInfobean.setUsericon ("ผู้ใช้ Avatar "); userinfobean.setUserId (userId); userinfobean.setUserName (" admin "); userinfobean.setUserpwd (" 123123132a "); return userinfobean;}/*** ส่งข้อความไปยังเพื่อนเป้าหมาย* @param && socketmap.get (messagebean.getFriendId ())! = null) {ซ็อกเก็ตซ็อกเก็ต = socketmap.get (messagebean.getFriendId ()); สตริงบัฟเฟอร์ = gson.tojson (ข้อความ); socket.getOutputStream (); output.write (buffer.getBytes ("utf-8")); // ส่ง data output.flush ();} catch (ioexception e) {// toDo generated blocke.printstacktrace ();}}}}}}}}}}}}}3. (รหัสลูกค้า) การเข้าสู่ระบบการเข้าสู่ระบบการเข้าสู่ระบบสามารถเข้าสู่ระบบได้หลายคน
การบันทึกข้อมูลสาธารณะระดับสาธารณะขยาย AppCompatactivity {ส่วนตัว edittext chat_name_text, chat_pwd_text; ปุ่มส่วนตัว chat_login_btn; @overrideprotected void onCreate (Bundle SavedInstancestate) {super.oncreate (edittext) findViewById (r.id.chat_name_text); chat_pwd_text = (edittext) findViewById (r.id.chat_pwd_text); chat_login_btn = (ปุ่ม) findViewById {@overridepublic เป็นโมฆะ onclick (ดู v) {สถานะ int = getLogin (chat_name_text.getText (). toString (). trim (), chat_pwd_text.getText (). toString (). trim (); toast.length_long) .show (); return;} getChatserver (getLogin (chat_name_text.getText (). toString (). trim (), chat_pwd_text.getText (). toString () MainActivity.class); startActivity (เจตนา); finish ();}});}/*** กลับไปที่สถานะการเข้าสู่ระบบ 1 คือผู้ใช้และ 2 คือผู้ใช้รายอื่น ที่นี่ผู้ใช้สองคนถูกจำลองเพื่อสื่อสารซึ่งกันและกัน ** @param ชื่อ* @param pwd* @return*/int ส่วนตัว getLogin (ชื่อสตริง, สตริง pwd) {ถ้า (textutils.isempty (ชื่อ) || textutils.isempty (pwd)) {return 0; 1; // user1} else ถ้า (name.equals ("admin") && pwd.equals ("2")) {return 2; // user2} อื่น {return -1; // รหัสผ่านข้อผิดพลาด}}/*** อินสแตนซ์บริการแชท ** @param สถานะ*4. (รหัสไคลเอนต์) การปรับเปลี่ยนรหัสบริการแชทแชท
แชทคลาสสาธารณะ {ซ็อกเก็ตซ็อกเก็ตส่วนตัว; Handler ส่วนตัว Handler; ข้อความส่วนตัวข้อความ Bean; ส่วนตัว GSON GSON = new GSON (); // รับกระแสเอาต์พุตจากวัตถุซ็อกเก็ตและสร้างวัตถุพิมพ์ภาพพิมพ์ {initMessage (สถานะ); initchatserver ();}/*** คิวข้อความใช้เพื่อส่งข้อความ ** @param handler*/โมฆะสาธารณะ setchathandler (handler handler) {this.handler = handler;} void ส่วนตัว initchatserver () {// เปิดเธรด {messageBean = new MessageBean (); userInfobean userInfobean = ใหม่ userInfobean (); userInfobean.setUserId (2); messageBean.SetMessageId (1); messageBean.SetchatType (1); userInfobean.setUserName ("admin"); userinfobean.SetUserPWD ("123123123a") และผู้ใช้เป้าหมายแชท idif (สถานะ == 1) {// ถ้าเป็นผู้ใช้ 1 จากนั้นเขาชี้ไปที่ผู้ใช้ 2 เพื่อแชท messagebean.setUserId (1); messageBean.setFriventId (2);} อื่นถ้า (สถานะ == 2) {// ถ้าเป็นผู้ใช้ 2 MessageBean.SetFriendId (1);} chatappliaction.userinfobean = userinfobean;}/*** ส่งข้อความ ** @param contentMsg*/โมฆะสาธารณะ sendMessage (สตริง contentMSG) {ลอง {ถ้า (socket == null) ปิด "; handler.sendMessage (ข้อความ); return;} byte [] str = contentMsg.getBytes (" UTF-8 "); // แปลงเนื้อหาเป็น UTF-8String AAA = สตริงใหม่ (str); MessageBean.setContent (AAA); String MessageJSON = GSON.TOJSON (MessageBean);/*** เนื่องจาก readline () บนเซิร์ฟเวอร์กำลังปิดกั้นการอ่าน* หากไม่สามารถอ่านอักขระใหม่หรือสตรีมเอาท์พุทได้ "/N";UOTPUT.WRITE(MESSAGEJSON.GETBYTES("UTF-8" ))-)// พิมพ์ตัวอักษรนิวเคลียสออก utput.flush (); // รีเฟรชสตรีมเอาต์พุตเพื่อให้เซิร์ฟเวอร์ได้รับสตริงทันที} catch (Exception e) {e.printStackTrace (); log.e ("ทดสอบ", "ข้อผิดพลาด:" + e.toString ());}}/*** รับข้อความและการใช้งาน {thread (new Runnable (ใหม่) คำขอไคลเอนต์ไปยังพอร์ตดั้งเดิม 8080 ซ็อกเก็ต = ซ็อกเก็ตใหม่ (socketurls.ip, socketurls.port); // รับกระแสอินพุตจากวัตถุซ็อกเก็ตและสร้าง bufferedreader วัตถุที่สอดคล้องกัน printwriter = printwriter ใหม่ DataOrtputStream (socket.getOutputStream ()); // รับข้อมูลจากไคลเอนต์ bufferedReader bff = ใหม่ bufferedReader (ใหม่ inputStreamReader (อินพุต)); // อ่านบรรทัดสตริงข้อมูลเซิร์ฟเวอร์ที่ส่ง บรรทัด); MessageBean MessageBean = GSON.FROMJSON (LINE, MessageBean.class); ข้อความข้อความ = handler.ObtainMessage (); message.obj = messageBean.getContent (); message.what = 1; handler.sendMessage (ข้อความ); ซ็อกเก็ตอินพุตสตรีมซ็อกเก็ต. close (); // ปิดซ็อกเก็ต} catch (ข้อยกเว้น e) {e.printstacktrace (); log.e ("ทดสอบ", "ข้อผิดพลาด:" + e.toString ());}}}) เริ่มต้น ()} ซ็อกเก็ตสาธารณะด้วยวิธีนี้ลอจิกรหัสได้รับการแก้ไขจากตรรกะของการส่งข้อความไปยังตรรกะของการแชทเดี่ยว
รหัสนี้อนุญาตให้ผู้ใช้ 1 และผู้ใช้ 2 แชทกันและเซิร์ฟเวอร์จะบันทึกประวัติการแชทระหว่างพวกเขา และเซิร์ฟเวอร์ยังมีฟังก์ชั่นของการส่งข้อความ
ด้านบนคือการเขียนโปรแกรมห้องแชท Java Socket ที่แนะนำโดย Editor (II) โดยใช้ซ็อกเก็ตเพื่อใช้ห้องแชทเดี่ยว ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!