การอ่านที่เกี่ยวข้อง: Java Socket Chat Room Programming (II) โดยใช้ซ็อกเก็ตเพื่อใช้ห้องแชทเดี่ยว
มีตัวอย่างมากมายของการใช้ซ็อกเก็ตเพื่อใช้การแชทบนอินเทอร์เน็ต แต่ฉันได้เห็นพวกเขามากมายและมีปัญหามากขึ้นหรือน้อยลง
ที่นี่ฉันจะใช้ตัวอย่างการแชทที่ค่อนข้างสมบูรณ์และอธิบายตรรกะในนั้น
เนื่องจากซ็อกเก็ตมีขนาดค่อนข้างใหญ่ฉันจะแบ่งบทความสองสามบทความเพื่อเขียนตัวอย่างซ็อกเก็ตที่ค่อนข้างสมบูรณ์
ที่นี่เราใช้ฟังก์ชั่นที่ง่ายที่สุดของการสื่อสารกับลูกค้าเซิร์ฟเวอร์และไคลเอนต์เพื่อรับรู้ถึงการส่งข้อความ
วัตถุประสงค์: เซิร์ฟเวอร์สร้างการเชื่อมต่อกับไคลเอนต์ ไคลเอนต์สามารถส่งข้อความไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์สามารถส่งข้อความไปยังไคลเอนต์
1. สร้างเซิร์ฟเวอร์แชทซ็อกเก็ตโดยใช้ Java
1. Socketurls กำหนดที่อยู่ IP และหมายเลขพอร์ต
Socketurls คลาสสาธารณะ {// ที่อยู่ IP สาธารณะสตริงคงสุดท้ายสุดท้าย ip = "192.168.1.110"; // หมายเลขพอร์ตสาธารณะสุดท้ายพอร์ต int คงสุดท้ายสาธารณะ = 8888;}2. ทางเข้าสู่โปรแกรมหลัก
ชั้นเรียนสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {ใหม่ chatserver (). initserver ();}}3. ชั้นเรียนถั่ว
userinfobean
ชั้นเรียนสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {ใหม่ chatserver (). initserver ();}}แชท MessageBean
Public Class MessageBean ขยาย userInfobean {ส่วนตัว Long MessageId; // ข้อความ idprivate long groupId; // กลุ่ม idprivate บูลีน isgoup; // ไม่ว่าจะเป็นกลุ่มข้อความส่วนตัว int atttype; // ประเภทข้อความ; 1, ข้อความ; 2, รูปภาพ; 3, วิดีโอสั้น ๆ ; ErrorCode; // รหัสข้อผิดพลาด // omit method get/set}4. บริการแชทแชทเซิร์ฟเวอร์โปรแกรมที่สำคัญที่สุด
คลาสสาธารณะแชทเซิร์ฟเวอร์ {// ซ็อกเก็ตบริการเซิร์ฟเวอร์เซิร์ฟเวอร์สแตติกส่วนตัวส่วนตัว; GSON GSON = new GSON ();/*** เริ่มต้นบริการซ็อกเก็ต*/โมฆะสาธารณะ initServer () {ลอง {// สร้างเซิร์ฟเวอร์เพื่อฟังคำขอของลูกค้าบนเซิร์ฟเวอร์พอร์ต 8080 catch blocke.printstacktrace ();}}/*** สร้างการจัดการข้อความและรับข้อความ*/โมฆะส่วนตัว createMessage () {ลอง {system.out.println ("รอการเข้าถึงผู้ใช้:"); socket.getport ()); // เปิดเธรดเด็กเพื่อรอซ็อกเก็ตอื่นเพื่อเข้าร่วมเธรดใหม่ (ใหม่ runnable () {โมฆะสาธารณะเรียกใช้ () {createMessage ();}}) เริ่มต้น (); // ส่งข้อมูลไปยังไคลเอ็นต์ InputStreamReader (socket.getInputStream ())); // เครื่องสแกนเนอร์ = ใหม่สแกนเนอร์ (socket.getInputStream ()); เธรดใหม่ (ใหม่ runnable () {โมฆะสาธารณะเรียกใช้ () {ลอง {สตริงบัฟเฟอร์; strin.readline (); // เพราะ readline ใช้บรรทัดใหม่เป็นจุดสิ้นสุดให้เพิ่มบัฟเฟอร์ใหม่ที่ส่วนท้าย += "/n";UOTPUT.WRITE(BUFFER.GETBYTES("UTF-8"); blocke.printstacktrace ();}}}). start (); // อ่านสายสตริงข้อมูลเซิร์ฟเวอร์ที่ส่ง = null; // ลูปเก็บข้อความจากซ็อกเก็ตปัจจุบันในขณะที่ (จริง) {thread.sleep (500); // system.out.println ("เนื้อหา:" null) {MessageBean MessageBean = GSON.FROMJSON (บรรทัด, messageBean.class); system.out.println ("ผู้ใช้:" + messageBean.getUserName ()); system.out.println ("เนื้อหา:" + messageBean.getContent (); blocke.printstacktrace (); system.out.println ("ข้อผิดพลาด:" + e.getMessage ());}}}2. ด้าน Android ใช้เป็นด้านมือถือเพื่อเชื่อมต่อกับเซิร์ฟเวอร์
1. เครื่องใช้งานอินสแตนติสบริการแชททั่วโลก
การแชทคลาสสาธารณะขยายแอปพลิเคชั่น {สาธารณะแชทแชทแชทเซิร์ฟเวอร์สาธารณะผู้ใช้งานคงที่ผู้ใช้งานผู้ใช้งานผู้ใช้งาน @Overridepublic เป็นโมฆะ onCreate () {super.on.oncreate ();}}}}2. ที่อยู่ IP และหมายเลขพอร์ตสอดคล้องกับเซิร์ฟเวอร์
3. ความแข็งแกร่งของการแชทเหมือนกับด้านเซิร์ฟเวอร์
4. เลย์เอาต์ XML เข้าสู่ระบบแชท
1. เข้าสู่ระบบ
<? xml version = "1.0" encoding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" Android: layout_width = "Match_parent" Android: layout_height = "match_pa RENT "Android: Orientation =" Vertical "> <editTextAndroid: id ="@+id/chat_name_text "Android: layout_width =" match_parent "Android: layou t_height = "wrap_content" Android: hint = "ชื่อผู้ใช้" Android: text = "admin"/> <editTextandroid: id = "@+id/chat_pwd_text" Android: layout_width = " match_parent "Android: layout_height =" wrap_content "Android: hint =" รหัสผ่าน "Android: text =" 123123123a "Android: inputType =" NumberPassword " /> <buttonandroid: id = "@+id/chat_login_btn" Android: layout_width = "match_parent" Android: layout_height = "wrap_content" Android: hint = "เข้าสู่ระบบ"/> </linearlayout>
2. แชท
<? xml version = "1.0" encoding = "utf-8"?> <linearlayout xmlns: Android = "http://schemas.android.com/apk/res/android" xmlns: เครื่องมือ = "http://schemas.android.com/tools" Android: layout_width = "Match_parent" Android เครื่องมือ "แนวตั้ง": context = ". activity.mainactivity"> <scrollViewAndroid: id = "@+id/scrollView" Android: layout_width = "Match_parent" Android: layout_height = "0dp" Android: layout_weight = "0.9" OID: id = "@+id/chat_ly" Android: layout_width = "match_parent" Android: layout_height = "match_parent" Android: การปฐมนิเทศ = "แนวตั้ง"> </linearlayout> </scrollview> ENT "Android: layout_height =" WRAP_CONTENT "Android: Orientation =" แนวนอน "> <editTextandroid: id ="@+id/chat_et "Android: layout_width =" 0dp "Android: layout_height =" Match_parent "Android /><buttonandroid:id="@+id/send_btn"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="0.2"android: text
5. การเข้าสู่ระบบของการเข้าสู่ระบบ
การบันทึกข้อมูลสาธารณะระดับสาธารณะขยาย 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) {ถ้า (getLogin (chat_name_text.getText (). toString (). trim (), chat_pwd_text.getText (). toString () mainactivity.class); startactivity (เจตนา); finish ();}}});} บูลีนส่วนตัว getLogin (ชื่อสตริง, สตริง pwd) {ถ้า (textutils.isempty (ชื่อ) || textutils.isempty (pwd)) return; false;} โมฆะส่วนตัว getChatserver () {chatappliaction.chatserver = new ChatServer ();}}6. การแชท MainActivity
คลาสสาธารณะ MainActivity ขยาย AppCompatactivity {Private LinearLayout chat_ly; private textView left_text, right_view; edittext ส่วนตัว chat_et ส่วนตัว; ปุ่มส่วนตัว send_btn; private viewgroup.layoutparams layoutparams = ใหม่ viewgroup.layoutparams (viewgroup.layout viewGroup.layoutparams.wrap_content);@overrideprotected void oncreate (ชุดข้อมูลบันทึก savedinstancestate) {super.oncreate (savedinstancestate); setContentView (r.layout.activity_main); chat_ly = findViewById (r.id.chat_et); send_btn = (ปุ่ม) findViewById (r.id.send_btn); send_btn.setonclicklistener (ใหม่ view.onclicklistener () {@overridepublic void onclick (ดู v) {chatappliaction.chatserver.sendMessage (chat_et.getText (). toString (). trim ()); chat_ly.addview (initrightview (chat_et.get.getText (). toString (). trim ()); {@overridepublic เป็นโมฆะ handleMessage (ข้อความข้อความ) {ถ้า (msg.what == 1) {// หลังจากส่งข้อความกลับมาอัปเดต uichat_ly.addview (initleftView (msg.obj.toString ());}}}}; MessageContent) {right_view = new textView (นี่); right_view.setLayoutparams (layoutparams); right_view.setGravity (view.focus_right); right_view.settext (messagecontent) messageContent) {left_text = new textView (นี่); left_text.setLayoutParams (layoutparams); left_text.setGravity (view.focus_left); left_text.settext (messageContent); return left_text;7. ตรรกะแชทแชทที่สำคัญที่สุด
แชทคลาสสาธารณะ {ซ็อกเก็ตซ็อกเก็ตส่วนตัว; Handler ส่วนตัว handler; ข้อความส่วนตัวข้อความเบียน, GSON ส่วนตัว GSON = new GSON (); // รับกระแสเอาต์พุตจากวัตถุซ็อกเก็ตและสร้างวัตถุพิมพ์ PrintWriter {initMessage (); initchatserver ();}/*** คิวข้อความใช้เพื่อส่งข้อความ ** @param handler*/โมฆะสาธารณะ setchathandler (handler handler) {this.handler = handler;} void ส่วนตัว initchatserver () {// เปิดเธรด = new MessageBean (); MessageBean.setUserId (1); MessageBean.setMessageId (1); MessageBean.SetchatType (1); MessageBean.setUserName ("admin"); chatappliaction.userinfobean = messageBean; == null) {ข้อความข้อความ = handler.obtainMessage (); message.what = 1; message.obj = "เซิร์ฟเวอร์ถูกปิด"; handler.sendMessage (ข้อความ); return;} byte [] str = contentMsg.getBytes ("utf-8"); MessageJson = gson.tojson (MessageBean);/*** เนื่องจาก readline () บนเซิร์ฟเวอร์กำลังปิดกั้นการอ่าน* หากไม่สามารถอ่านอักขระใหม่หรือสตรีมเอาท์พุทสิ้นสุดลงมันจะถูกบล็อกที่นั่น* ดังนั้นจึงมีการเพิ่มอักขระใหม่ในตอนท้ายของข้อความ JSON เพื่อบอกเซิร์ฟเวอร์ "/N";UOTPUT.WRITE(MESSAGEJSON.GETBYTES("UTF-8" ))-)// นิวไลน์ print.fut.flush (); // รีเฟรชสตรีมเอาต์พุตเพื่อให้เซิร์ฟเวอร์ได้รับสตริงทันที} catch (Exception e) {E.printStackTrace (); log.e ("ทดสอบ", "ข้อผิดพลาด:" + e.toString ());}}/*** รับข้อความในเธรดลูก*/โมฆะส่วนตัว คำขอไคลเอนต์ไปยังพอร์ตดั้งเดิม 8080 ซ็อกเก็ต = ซ็อกเก็ตใหม่ (socketurls.ip, socketurls.port); // รับกระแสอินพุตจากวัตถุซ็อกเก็ตและสร้าง bufferedreader วัตถุที่สอดคล้องกัน printwriter = printwriter ใหม่ DataOrtputStream (socket.getOutputStream ()); // รับข้อมูลจากไคลเอนต์ bufferedReader bff = ใหม่ bufferedReader (ใหม่ inputStreamReader (อินพุต)); // อ่านบรรทัดสตริงข้อมูลเซิร์ฟเวอร์ที่ส่งมา; บรรทัด); ข้อความข้อความ = handler.obtainMessage (); message.obj = line; message.what = 1; handler.sendMessage (ข้อความ);} ถ้า (ซ็อกเก็ต == null) break;} output.close (); // ปิดซ็อกเก็ตอินพุต {E.PrintStackTrace (); log.e ("ทดสอบ", "ข้อผิดพลาด:" + e.toString ());}}}). start ();}}}โดยวิธีการรหัสทั้งหมดเสร็จสมบูรณ์
การสาธิตนี้สามารถเปิดใช้งานโทรศัพท์มือถือเพื่อส่งข้อความไปยังเซิร์ฟเวอร์และเซิร์ฟเวอร์ไปยังโทรศัพท์มือถือ
การสาธิตนี้ถือได้ว่าเป็นฟังก์ชั่นการผลักดัน แต่การกดที่แท้จริงนั้นไม่ง่ายเลย ในฐานะที่เป็นมือใหม่ของซ็อกเก็ตคุณสามารถเห็นแนวคิดของการเขียนโปรแกรมซ็อกเก็ต
ด้านบนคือการเขียนโปรแกรมห้องแชท Java Socket ที่แนะนำโดย Editor (1) เพื่อใช้ซ็อกเก็ตเพื่อใช้การกดข้อความแชท ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!