في المقالة السابقة برمجة غرفة الدردشة Java Socket (1) باستخدام Socket لتنفيذ Push Message Push ، تحدثنا عن كيفية استخدام Socket لجعل الرسائل تمر بين الخادم والعميل لتحقيق الغرض من دفع الرسائل. بعد ذلك ، سأكتب عن كيفية تمكين الخادم من إنشاء اتصال بين العميل والعميل.
في الواقع ، هو إنشاء اتصال محادثة فردي.
يختلف إلى حد ما عن الكود السابق الذي قام بتطبيق رسائل الدفع ، وتم تعديله عليه.
إذا لم يتم ذكر الأساليب أو الفئات ، فهي نفسها تمامًا كما في المقالة السابقة.
1. تعديل فئة الكيان (فئة الكيان على الخادم والعميل هي نفسها)
1. جدول معلومات المستخدم المستخدم
userInfoBean الفئة العامة تنفذ serializable {private static final long serialversionuid = 2l ؛ private long userId ؛ // user idprivate string username ؛ // اسم المستخدم lipename lipense ؛ // لقب السلسلة الخاصة userpwd ؛2. جدول معلومات دردشة الرسائل
MessageBean Public Class PrecipeBean قابلة للتسلسل {private static static frend ong serialversionuid = 1l ؛ private messageId ؛ errorrormsg ؛ // error message private int errordcode ؛ // error code private private instr3. جدول مرفق رسالة MessageFilebean
تنفذ messagefilebean من الفئة العامة ، {private static static final long serialversionuid = 3l ؛ private int fileId ؛ // file iDprivate string fileName ؛ // file name private long fileLength ؛ // file length byte [] filebyte ؛ // file content filetype ؛2. (تعديل رمز الجانبي) دراس الدردشة الرئيسي في خادم Server
chatserver الفئة العامة {// Socket Service Servers Servers ServerSocke Server ؛ // استخدم ArrayList لتخزين جميع قائمة SocketPublic <Socket> SocketList = new ArrayList <> () ؛ // Imitate Socketpublic Map <Integer ، socket> socketMap = new hashmap () ؛ hashmap () ؛ public gson gson = new gson () ؛/*** تهيئة خدمة المقبس*/public void initserver () {try {// إنشاء serverSocket للاستماع إلى طلبات العملاء على port 8080 server = new serversocket (socketurls.port) ؛ createMessage () ؛} blocke.printstacktrace () ؛}}/*** إنشاء إدارة الرسائل واستمر في تلقي الرسائل*/private void createMessage () {try {system.out.println ("في انتظار وصول المستخدم:") SocketList.add (socket) ؛ system.out.println ("وصول المستخدم:" + socket.getport ()) ؛ معلومات من العميل BufferedReader BFF = جديد bufferedReader (جديد inputStreamReader (socket.getInputStream ())) ((line = bff.readline ())! = null) {// parse the estity class messageBean = gson.fromjson (line ، messageBean.class) ؛ // إضافة معلومات المستخدم في الخريطة ، وقم بتقليدها في قاعدة البيانات والذاكرة // يتم تخزين فئة الكيان في البيانات ويتم تسجيل الجيب في الذاكرة. يتم استخدام معرف المستخدم باعتباره مرجع setChatMap (messageBean ، socket) ؛ // إعادة توجيه الرسالة التي أرسلها المستخدم إلى صديقها المستهدف (messageBean) ؛ system.out.println ("المستخدم:" + usermap.get ( + messageBean.getUserId ()). server.close () ؛} catch (استثناء e) {// todo catch catch blocke.printstacktrace () ؛ system.out.println ("خطأ:" + e.getMessage ()) ؛}/*** أرسل رسالة*/private void getMessage () {// أدخل BufferedReader من وحدة التحكم strin = new BufferedReader (New InputStreamReader (System.in)) {outputStream Output = socket.getOutputStream () ؛ output.write (buffer.getBytes ("utf-8")) ؛ // إرسال إخراج البيانات. الذاكرة** param messageBean* param scoket*/private void setChatMap (messageBean messageBean ، Socket Scoket) {// احفظ معلومات المستخدم if (usermap! = null && usermap.get (messageBean.getuserId ()) == null) getUserInfoBean (messageBean.getuserId ()))) ؛} // حفظ المقبس المرتبط المقابل إذا (socketMap! = null && socketmap.get (messageBean.getuserid ()) == null) هنا** param userid* @return*/userinfoBean getUserInFobean (int userId) {userInfobean userInfobean = new userInfobean () ؛ userInfobean.setusericon ("user Avatar ") ؛ userInfobean.setUserId (userId) ؛ userInfoBean.setUserName (" admin ") ؛ userInfobean.setUserPwd (" 123123132a getfired (messageBean) && socketmap.get (messageBean.getFriendId ())!! = null) {socket socket = socketmap.get (messageBean.getfriendId ()) ؛ String buffer = gson.tojson (messageBean) ؛ // لأن القراءة هي نقطة النهاية مع خط جديد ، أضف مخزن مؤقت جديد في النهاية += "/n" socket.getOutputStream () ؛ output.write (buffer.getBytes ("utf-8")) ؛ // إرسال بيانات الإخراج.3. (رمز العميل) يمكن تعديل صفحة تسجيل الدخول إلى تسجيل الدخول إلى العديد من الأشخاص
تمتد تسجيل الدخول إلى الفئة العامة AppCompatActivity {private edittext chat_name_text ، chat_pwd_text ؛ زر خاص chat_login_btn ؛ overrideprotected void onCreate (bundleative_login) (edittext) findViewById ( {overridepublic void onClick (view v) {int status = getLogin (chat_name_text.gettext (). toString (). trim () ، chat_pwd_text.gettext (). Toast.length_long) .show () ؛ return ؛} getChatserver (getLogin (chat_name_text.gettext (). MainActivity.class) ؛ البدء (النية) ؛ إنهاء () ؛}}) ؛}/*** العودة إلى حالة تسجيل الدخول ، 1 هو المستخدم و 2 هو المستخدم الآخر. هنا ، يتم محاكاة اثنين من المستخدمين للتواصل مع بعضهما البعض ** param اسم* param pwd* @return*/private int getLogin (اسم السلسلة ، السلسلة pwd) {if (textutils.isempty (name) || textutils.isempty (pwd)) {return 0 ؛ 1 ؛ // user1} آخر إذا (name.equals ("المسؤول")4. (رمز العميل) تعديل منطق رمز خدمة الدردشة الدردشة
private chatserver {private Socket Socket ؛ معالج المعالج الخاص ؛ MessageBean MessageBean ؛ Private GSON GSON = جديد GSON () {initMessage (الحالة) ؛ initchatserver () ؛}/*** قائمة انتظار الرسائل ، المستخدمة لتمرير الرسائل ** معالج param*/public void setchathandler (معالج معالج) {this.handler = handler ؛} private void initchatserver () {messageBean = new MessageBean () ؛ userInfobean userInfobean = جديد userInfobean () ؛ userInfobean.setUserId (2) ؛ messageBean.setMessageId (1) ؛ messageBean.SetchatType (1) ؛ userInfobean.setUsername ("admin") ومستخدم مستهدف الدردشة IDIF (status == 1) {// إذا كان مستخدمًا 1 ، فهو يشير إلى المستخدم 2 إلى chat messageBean.setUserId (1) ؛ messageBean.setfriendid (2) ؛} آخر إذا (الحالة == 2) {// إذا كان المستخدم 2 ، فسيشير إلى المستخدم 1 إلى messageBean.setuserid (2) ؛ messageBean.setfriendId (1) ؛} chatappliaction.userInfoBean = userInfoBean ؛}/*** أرسل رسالة ** param contentMsg*/public void sendMessage (string contentmsg) {try {if (socket == null) {message ؛ مغلق "؛ معالج. messageBean.setContent (aaa) ؛ string messagejson = gson.tojson (messageBean) ؛/*** لأن readline () على الخادم يمنع القراءة* إذا لم يتمكن من قراءة حرف الخط الجديد أو تنتهي دفق الإخراج ، فسيتم حظره هناك* لذلك تتم إضافة حرف جديد في نهاية رسالة JSON لإخبار الخادم بأن الرسالة قد تم إرسالها*/ "/ne" ؛ output.write(messagejson.getBytes("utf-8")) ؛// print newline output.flush () ؛ . إلى المنفذ الأصلي 8080 Socket = مقبس جديد (socketurls.ip ، socketurls.port) ؛ // احصل على دفق الإدخال من كائن المقبس وإنشاء كائن bufferreaderer المقابل printWriter = new printWriter (socket.getOutputStream () ؛ DataOtputStream (Socket.getOutputStream ()) ؛ // الحصول على معلومات من العميل Bufferreader BFF = جديد BufferReader (New InportStreamRead (إدخال)) "المحتوى:" + سطر) ؛ messageBean messageBean = gson.fromson (السطر ، messageBean.class) ؛ رسالة message = handler.obtainmessage () ؛ message.obj = messageBean.getContent () input.close () ؛ // إغلاق مقبس دفق الإدخال socket.close () ؛ // إغلاق المقبس} catch (استثناء e) {e.printstacktrace () ؛ log.e ("test" ، "خطأ:" + e.toString ()) ؛}}).وبهذه الطريقة ، تم تعديل منطق الكود من منطق الضغط على الرسائل إلى منطق الدردشة المفردة.
يسمح هذا الرمز للمستخدم 1 والمستخدم 2 بالدردشة مع بعضهما البعض ، وسيقوم الخادم بتسجيل سجل الدردشة بينهما. كما أن الخادم لديه وظيفة دفع الرسائل.
ما سبق هو برمجة غرفة دردشة جافا مقبس جافا التي قدمها لك المحرر (2) باستخدام Socket لتنفيذ غرفة دردشة واحدة. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر على الجميع في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!