Ditulis sebelumnya:
Mungkin ini adalah akhir periode, dan berbagai desain kursus datang satu demi satu. Baru-baru ini, saya melihat dua pertanyaan dan jawaban di CSSDN, yaitu menulis program obrolan berbasis soket. Kebetulan saya telah melakukan sesuatu dengan Socket baru -baru ini. Karena minat, saya mengambil waktu luang beberapa malam untuk mengetuknya. Saat ini, hanya mendukung obrolan tunggal, obrolan grup, dan fungsi transfer file. Pertama, saya memposting gambar program yang jelek (UI ditulis dalam ayunan Java, saya sudah lupa yang ini untuk waktu yang lama, jadi saya tidak bisa tidak membaca JDK API untuk menulis satu), seperti yang ditunjukkan di bawah ini:
Desain Server:
Server memiliki dua operasi utama: satu adalah untuk memblokir soket klien penerima dan melakukan pemrosesan respons, dan yang lainnya adalah mendeteksi detak jantung klien. Jika klien tidak mengirim detak jantung untuk jangka waktu tertentu, lepaskan klien, buat server, dan kemudian mulai dua kumpulan utas untuk menangani dua hal ini (newfixedthreadpool, newscheduledthreadpool). Kelas pemrosesan yang sesuai adalah SocketDispatcher dan SocketsChedule. SocketDispatcher didistribusikan ke Sockethandlers yang berbeda sesuai dengan permintaan soket yang berbeda. SocketWrapper menambahkan pembungkus shell ke soket, dan merekam waktu interaksi terbaru soket dengan soket menyimpan koleksi soket yang saat ini berinteraksi dengan server. Desainnya adalah sebagai berikut:
Desain Klien:
Desain klien terutama dibagi menjadi dua bagian, yaitu desain modul komunikasi soket dan desain terkait UI
Desain komunikasi soket klien sebenarnya mirip dengan server. Perbedaannya adalah bahwa server menerima paket detak jantung, sementara klien mengirimkan paket detak jantung. Karena klien hanya berkomunikasi dengan satu server (komunikasi antara klien juga didistribusikan oleh server), hanya kumpulan utas ukuran 2 yang digunakan untuk menangani kedua hal ini (NewfixedThreadPool (2)). Kelas pemrosesan yang sesuai adalah penerima dan keepalivedog. Ketika penerima diinisialisasi, panggilan balik dikirim sebagai panggilan balik ke klien menerima pesan server. Implementasi callback default adalah DefaultCallback. DefaultCallback didistribusikan ke penangan yang berbeda melalui HF sesuai dengan berbagai peristiwa. ClientHolder menyimpan informasi klien saat ini. Desainnya adalah sebagai berikut:
Desain terkait UI, saya tidak berencana untuk menulis UI sendiri. Lagi pula, apa yang saya tulis terlalu jelek, jadi saya mungkin meminta teman sekelas atau teman saya untuk membantu saya mengetuknya nanti, jadi saya menyerahkan pemrosesan acara UI untuk bertindak untuk menanganinya, dan cukup memisahkan respons desain dan acara UI. Semua UIS mewarisi JFrame dan mengimplementasikan antarmuka tampilan. Kelas implementasi pawang di atas diperoleh melalui router (akan dikembalikan secara langsung jika ada, dan akan dibuat dan disimpan jika tidak ada). Tampilan menyediakan kreasi UI (), dapatkan wadah (), dapatkan komponen di UI getComponent (), display display (), dan mendaur ulang sampah (); Hasil dan resultholder hanya untuk membuat dan menyimpan tab obrolan.
Desain Modul Umum:
Modul umum terutama interaksi data, di mana data JSON digunakan untuk interaksi. Modul umum mendefinisikan berbagai jenis informasi interaksi, transmisi informasi soket yang diimplementasikan oleh Sendhelper, I18N adalah bahasa, dan nilai konstan adalah konfigurasi dan konstanta dalam sistem (konstanta adalah semua antarmuka, yang mungkin tidak terlalu baik). Untuk ReturnMessage, ia memiliki serangkaian DTO sebagai atribut kontennya.
Entri Program:
Akhirnya, program masuk untuk server dan klien diberikan (kode lengkap digantung di CSDN, dan itu akan diperbarui terus menerus jika Anda punya waktu, dan artikel akan memiliki alamat di akhir)
Portal Server:
Paket Yaolin.chat.server; impor java.io.ioexception; impor java.net.serversocket; impor java.util.date; impor java.util.concurrent.executorservice; import java.util.concurrent.executors; impor java.util.util.utrentsecutorsecutorscutor; java.util.concurrent.timeunit; impor yaolin.chat.common.constantValue; impor yaolin.chat.util.loggerutil;/*** server* @author yaolin*/server kelas publik {server server final swasta; Pool Final ExecutorService Pribadi; server publik () melempar ioException {server = server baru (constantValue.server_port); pool = executors.newfixedThreadPool (constantValue.max_pool_size); } public void start () {try {scheduledExecutorService jadwal = executors.newsChedulEdThreadPool (1); // tonton anjing. Pengecualian?? jadwal. while (true) {pool.execute (SocketDispatcher baru (server.accept ())); Loggerutil.info ("Terima klien di" + tanggal baru ()); }} catch (ioException e) {pool.shutdown (); }} public static void main (string [] args) {coba {baru server (). start (); } catch (ioException e) {loggerutil.error ("Server Start gagal! ->" + e.getMessage (), e); }}} Portal Klien:
paket yaolin.chat.client; import java.io.ioexception; impor javax.swing.joptionpane; import yaolin.chat.client.callback.defaultcallback; import eaolin.chat.client.view.router; impor yaolin.chat.client.view. Yaolin * */kelas publik niloaychat {public static void main (string [] args) {registerAndLoginView v = (registerAndLoginView) router.getView (registerAndLoginView.class) .create (); coba {v.display (); Klien klien = klien baru (DefaultCallback baru ()); client.start (); Clientholder.setClient (klien); } catch (ioException e) {joptionpane.showmessagealog (v.getContentPane (), e.getMessage ()); }}} Kode Sumber Unduh: Demo
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.