Artikel ini berbagi contoh untuk memenuhi kebutuhan komunikasi web online. Karena versi web fungsi obrolan online yang diimplementasikan oleh java socket, untuk referensi Anda, konten spesifiknya adalah sebagai berikut
Langkah Implementasi:
1. Gunakan komponen dan soket AWT untuk mengimplementasikan klien tunggal sederhana untuk terus mengirim pesan ke server;
2. Dikombinasikan dengan utas, sadari koneksi multi-klien ke server untuk mengirim pesan;
3. Menerapkan pesan klien penerusan server ke semua klien dan menampilkannya pada klien secara bersamaan;
4. Ubah antarmuka jendela yang dihasilkan oleh komponen AWT ke antarmuka yang ditampilkan oleh front-end JSP atau HTML, dan ubah klien yang diimplementasikan oleh Java Socket ke implementasi teknologi front-end.
Di sini kami pertama -tama menerapkan fungsi sederhana dari langkah pertama, kesulitannya adalah:
1. Saya tidak pernah menggunakan komponen AWT dan saya tidak pernah menggunakan acara mendengarkan yang berhubungan dengan Java;
2. Saya belum menggunakan soket untuk jangka waktu yang lama untuk berinteraksi antara klien dan server, dan saya belum benar -benar mengembangkan struktur CSS.
Kode untuk mengimplementasikan fungsi :
Klien Obrolan Online:
1. Hasilkan garis besar antarmuka jendela grafis
2. Tambahkan acara dekat ke garis besar
3. Tambahkan area input dan area tampilan konten ke garis besar
4. Tambahkan acara pengembalian kereta ke area input
5. Buat koneksi server dan kirim data
paket chat.chat; impor java.awt.borderlayout; impor java.awt.frame; impor java.awt.textarea; impor java.awt.textfield; impor java.awt.event.actionevent; impor java.awt.event.actionlistener; impor java.awt.event.windowadapter; impor java.awt.event.windowevent; impor java.io.dataoutputStream; impor java.io.ioException; impor java.net.socket; impor java.net.unknownhostException; /** * Online chat client 1. Generate graphical window interface outline 2. Add a close event to the outline 3. Add an input area and a content display area to the outline 4. Add a carriage return event for the input area* 5. Establish a server connection and send data* * @author tuzongxun123 * */ public class ChatClient extends Frame { // User input area private TextField tfTxt = new TextField(); // tampilan konten Area TextArea Private Taste = new TextArea (); soket soket pribadi = null; // Data Output Stream Private DataOutputStream DataOutputStream = null; public static void main (string [] args) {new chatclient (). launcframe (); } / ** * Buat jendela grafis sederhana * * @author: tuzongxun * @title: launcframe * @param * @return void * @Date 18 Mei 2016 9:57:00 AM * @Throws * / public void launcframe () {setLocation (300, 200); this.setsize (200, 400); add (tftxt, borderlayout.south); add (tarea, borderlayout.north); mengemas(); // Dengarkan acara penutupan jendela antarmuka grafis this.addwindowlistener (windowAdapter baru () {@Override public void windowclosing (windowevent e) {system.exit (0); disconnect ();}}); tftxt.addactionListener (tflister baru ()); setVisible (true); menghubungkan(); } / ** * Sambungkan ke server * * @Author: tuzongxun * @title: connect * @param * @return void * @Date 18 Mei 2016 9:56:49 AM * @THROWS * / public void connect () {coba {// Buat socket server baru = socket baru ("127.0.0.0.0.0.0.0.1.1); // Dapatkan aliran output klien dataOutputStream = DataOutputStream baru (socket.getoutputStream ()); System.out.println ("Sambungkan ke server"); } catch (unknownHostException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }} / ** * Tutup sumber daya klien * * @author: tuzongxun * @title: Disconnect * @param * @return void * @Date 18 Mei 2016 9:57:46 AM * @throws * / public void Disconnect () {DataOutputStream.close (); socket.close (); } catch (ioException e) {e.printstacktrace (); }} / ** * Kirim pesan ke server * * @Author: tuzongxun * @title: sendMessage * @param @param Text * @return void * @date 18 Mei 2016 9:57:56 AM * @throws * / private void sendMessage (string text) {data {dataOutSputStream * @throws * / private void (string text) {DataOutStream.WriteTer (string) {DataOutStream.WrowseT (String Text) {DataOutStream.WrowseR (String Text) {DataOutStream. dataOutputStream.flush (); } catch (ioException e1) {e1.printstacktrace (); }} / ** * Area input jendela grafis untuk mendengarkan acara carriage return * * @author tuzongxun123 * * / kelas privat tflister mengimplementasikan ActionListener {@Override public void actionPerformed (actionEvent e) {string text = tftx.gettext (). Trim (); Taxa.SetText (teks); tftxt.setText (""); // Kirim data ke server sendMessage (teks); }}} Server:
paket chat.chat; impor java.io.datainputstream; impor java.io.eofexception; impor java.io.ioException; impor java.net.bindexception; impor java.net.serversocket; impor java.net.socket; /*** Java menggunakan komponen soket dan awt untuk hanya mengimplementasikan fungsi obrolan online. Server dapat mewujudkan server untuk terus mengirim pesan ke server setelah menghubungkan satu klien* tetapi tidak mendukung banyak klien untuk terhubung pada saat yang sama. Alasannya adalah bahwa setelah mendapatkan koneksi klien dalam kode, itu akan terus mendengarkan input klien dilingkarkan, menyebabkan penyumbatan* sehingga server tidak dapat mendengarkan klien lain dua kali. Jika Anda ingin mengimplementasikannya, Anda perlu menggunakan asynchronous atau multithreaded * * @author tuzongxun123 * */ kelas publik chatserver {public static void main (string [] args) {// apakah server mulai berhasil boolean isStart = false; // Server Socket Server SS = NULL; // soket soket klien soket = null; // Server Baca Data Klien Input Stream DataInputStream DataInputStream = null; Coba {// Mulai Server SS = New ServerSocket (8888); } catch (BindException e) {System.out.println ("Port sudah digunakan"); // Tutup program System.exit (0); } catch (Exception e) {E.PrintStackTrace (); } coba {isStart = true; while (isStart) {boolean isConnect = false; // Mulai soket mendengarkan = ss.accept (); System.out.println ("One Client Connect"); isConnect = true; while (iSconnect) {// Dapatkan aliran input klien datalputStream = new DataInputStream (socket.getInputStream ()); // Baca data yang disahkan oleh string klien pesan = datalputStream.readutf (); System.out.println ("Klien mengatakan:" + pesan); }}} catch (eOfException e) {System.out.println ("Klien Tertutup!"); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {// tutup sumber daya terkait coba {datalputStream.close (); socket.close (); } catch (ioException e) {e.printstacktrace (); }}}}Lanjutkan, berdasarkan koneksi klien tunggal, langkah kedua di sini memerlukan implementasi beberapa koneksi klien, yang membutuhkan penggunaan utas. Setiap kali klien baru terhubung, server perlu memulai utas baru untuk diproses, sehingga menyelesaikan masalah pemblokiran dalam pembacaan loop sebelumnya.
Biasanya ada dua metode untuk menulis utas: mengintegrasikan utas atau mengimplementasikan antarmuka runnable. Pada prinsipnya, jika runnable dapat diimplementasikan, itu tidak akan diwarisi karena cara mengimplementasikan antarmuka lebih fleksibel.
Kode klien belum berubah dibandingkan dengan sebelumnya dan telah menjadi server, jadi hanya kode server yang diposting di sini:
Java menggunakan komponen soket dan awt dan multi-threading untuk hanya mengimplementasikan server fungsi obrolan online:
Setelah banyak klien terhubung, pesan terus dikirim ke server. Dibandingkan dengan versi pertama, fokusnya adalah menggunakan multi-threading. Server belum menerapkan fungsi penerusan. Klien hanya dapat melihat informasi yang dimasukkan dengan sendirinya di jendela grafik, dan tidak dapat melihat pesan yang dikirim oleh klien lain.
paket chat.chat; impor java.io.datainputstream; impor java.io.eofexception; impor java.io.ioException; impor java.net.bindexception; impor java.net.serversocket; impor java.net.socket; impor java.net.socketexception; / ** * * * @author tuzongxun123 * */ kelas publik chatserver {public static void main (string [] args) {new chatserver (). start (); } // Apakah server mulai berhasil boolean pribadi isStart = false; // Server Socket Private Serversocket SS = NULL; // soket klien soket pribadi = null; public void start () {try {// start server ss = new ServerSocket (8888); } catch (BindException e) {System.out.println ("Port digunakan"); // Tutup program System.exit (0); } catch (Exception e) {E.PrintStackTrace (); } coba {isStart = true; while (isStart) {// mulai mendengarkan soket = ss.accept (); System.out.println ("One Client Connect"); // Mulai klien klien klien = klien baru (soket); utas baru (klien) .start (); }} catch (Exception e) {e.printstacktrace (); } akhirnya {// tutup layanan coba {ss.close (); } catch (ioException e) {e.printstacktrace (); }}} / ** * utas klien * * @author tuzongxun123 * * / kelas mengimplementasikan klien runnable {// soket klien soket pribadi = null; // Stream Input Klien Private DataInputStream DataInputStream = null; private boolean isConnect = false; klien publik (soket soket) {this.socket = socket; coba {isConnect = true; // Dapatkan klien input stream datalputStream = new DataInputStream (socket.getInputStream ()); } catch (ioException e) {e.printstacktrace (); }} @Override public void run () {isConnect = true; Coba {while (iSconnect) {// Baca data yang dilewati oleh klien string message = datalputStream.readutf (); System.out.println ("Klien mengatakan:" + pesan); }} catch (eofexception e) {System.out.println ("Client Closed!"); } catch (SocketException e) {System.out.println ("Klien ditutup !!!"); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {// tutup sumber daya yang relevan coba {datalputStream.close (); socket.close (); } catch (ioException e) {e.printstacktrace (); }}}}}Di atas terutama memperkenalkan fungsi menggunakan utas untuk memungkinkan server menerima permintaan multi-klien. Di sini, klien perlu menerima pesan multi-klien saat meneruskan pesan ke setiap klien yang terhubung, dan klien harus dapat menampilkannya di area tampilan konten, sehingga mewujudkan obrolan grup online sederhana.
Saat menerapkan penerusan klien, itu tidak lebih dari meningkatkan aliran output; Sebelumnya, klien hanya mengirim tetapi tidak menerimanya, sehingga juga perlu mengubah klien untuk menerima pesan server secara melingkar, sehingga juga perlu menerapkan multi-threading.
Saat menerapkan fungsi ini, saya secara tidak sengaja ingat fungsi membuat kode verifikasi secara acak, jadi saya memiliki inspirasi tiba -tiba untuk secara acak menghasilkan nama untuk setiap klien, sehingga ketika mengeluarkan, itu lebih terlihat seperti obrolan grup, tidak hanya memiliki output pesan, tetapi juga dapat melihat siapa itu.
Setelah menerapkan fungsi -fungsi ini, Anda pada dasarnya dapat memiliki obrolan grup secara online pada saat yang sama untuk beberapa orang. Karena ada metode utama dalam kode, Anda dapat membuat server dan klien ke dalam paket JAR yang dapat dieksekusi. Anda dapat merujuk ke posting blog saya yang lain: Gunakan Eclipse untuk membuat paket JAR yang dapat dieksekusi program Java.
Kemudian klik dua kali file jar yang sesuai di desktop untuk memulai server dan klien, dan Anda tidak perlu lagi mengandalkan Eclipse untuk dijalankan.
Kode klien yang dimodifikasi adalah sebagai berikut:
paket chat.chat; impor java.awt.borderlayout; impor java.awt.frame; impor java.awt.textarea; impor java.awt.textfield; impor java.awt.event.actionevent; impor java.awt.event.actionlistener; impor java.awt.event.windowadapter; impor java.awt.event.windowevent; impor java.io.datainputstream; impor java.io.dataoutputStream; impor java.io.ioException; impor java.net.socket; impor java.net.unknownhostException; impor java.util.random; /** * Langkah Klien Obrolan Online: * 1. Hasilkan Garis Besar Antarmuka Jendela Grafis*2. Tambahkan acara dekat untuk garis besar*3. Tambahkan area input dan area tampilan konten di garis besar*4. Tambahkan acara carriage return untuk area input*5. Buat koneksi server dan kirim data * * @author tuzongxun123 * */ kelas publik chatclient memperluas frame {/ ** * */ private static final long serialVersionuid = 1l; // Area Input Pengguna Private Textfield TFTXT = new TextField (); // tampilan konten Area TextArea Private Taste = new TextArea (); soket soket pribadi = null; // Data Output Stream Private DataOutputStream DataOutputStream = null; // Data Input Stream Private DataInputStream DataInputStream = null; private boolean isConnect = false; Thread treceive = utas baru (new receivethread ()); String name = ""; public static void main (string [] args) {chatclient chatclient = new chatclient (); chatclient.createName (); chatclient.launcframe (); } / ** * Buat jendela grafis sederhana * * @author: tuzongxun * @title: launcframe * @param * @return void * @Date 18 Mei 2016 9:57:00 AM * @Throws * / public void launcframe () {setLocation (300, 200); this.setsize (200, 400); add (tftxt, borderlayout.south); add (tarea, borderlayout.north); // Tentukan ukuran optimal bingkai sesuai dengan tata letak di jendela dan ukuran yang disukai dari paket komponen (); // Dengarkan acara penutupan jendela antarmuka grafis this.addwindowlistener (windowAdapter baru () {@Override public void windowclosing (windowevent e) {system.exit (0); disconnect ();}}); tftxt.addactionListener (tflister baru ()); // atur jendela untuk melihat setVisible (true); menghubungkan(); // Mulai utas yang menerima pesan treceive.start (); } / ** * Sambungkan ke server * * @Author: tuzongxun * @title: connect * @param * @return void * @Date 18 Mei 2016 9:56:49 AM * @THROWS * / public void connect () {coba {// Buat socket server baru = socket baru ("127.0.0.0.0.0.0.0.1.1); // Dapatkan aliran output klien dataOutputStream = DataOutputStream baru (socket.getoutputStream ()); datalputStream = new DataInputStream (socket.getInputStream ()); System.out.println ("Sambungkan ke server"); isConnect = true; } catch (unknownHostException e) {e.printstacktrace (); } catch (ioException e) {e.printstacktrace (); }} // menghasilkan nama klien acak public void createName () {string [] str1 = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "", "k", "l", "m", "n", "o", "", "K", "l", "m", "n", "o", "" "," K "", "m", "n", "o", "p" "" "", "s" s " "w", "x", "y", "z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; Rand ran = acak baru (); untuk (int i = 0; i <6; i ++) {// long num = math.round (math.random () * (str1.length - 0)+0); // int n = (int) num; int n = ran.nextint (str1.length); if (n <str1.length) {string str = str1 [n]; name = name + str; System.out.println (nama); } else {i--; melanjutkan; }} this.settitle (name); } / ** * Tutup sumber daya klien * * @author: tuzongxun * @title: putuskan * @param * @return void * @Date 18 Mei 2016 9:57:46 AM * @Throws * / public void Disconnect () {coba {isConnect = false; // hentikan thread treceive.join (); } catch (InterruptedException e) {E.PrintStackTrace (); } akhirnya {coba {if (dataoutputStream! = null) {dataoutputStream.close (); } if (socket! = null) {socket.close (); soket = null; }} catch (ioException e) {E.PrintStackTrace (); }}} / ** * Kirim pesan ke server * * @Author: tuzongxun * @title: sendMessage * @param @param Text * @return void * @date 18 Mei 2016 9:57:56 AM * @throws * / private void sendMessage (string text) {try {data {data {data {data {data); dataOutputStream.flush (); } catch (ioException e1) {e1.printstacktrace (); }} / ** * Area input jendela grafis Area mendengarkan carriage return event * * @author tuzongxun123 * * / kelas private tflister mengimplementasikan ActionListener {@Override public void actionPerformed (actionEvent e) {string text = tftxt.getText (). Trim (); // Bersihkan informasi area input tftxt.setText (""); // Kirim data ke server setelah menekan carriage ke sendmessage (teks); }} private class receivethread mengimplementasikan runnable {@Override public void run () {try {while (isConnect) {string message = datalputStream.readutf (); System.out.println (pesan); String txt = taxa.getText (); if (txt! = null &&! "". Equals (txt.trim ())) {message = taxa.gettext () + "/n" + pesan; } taxa.setText (pesan); }} catch (ioException e) {E.PrintStackTrace (); }}}} Kode server yang dimodifikasi adalah sebagai berikut:
paket chat.chat; impor java.io.datainputstream; impor java.io.dataoutputStream; impor java.io.eofexception; impor java.io.ioException; impor java.net.bindexception; impor java.net.serversocket; impor java.net.socket; impor java.net.socketexception; impor java.util.arraylist; impor java.util.list; /** * Java menggunakan komponen soket dan awt dan multi-threading untuk hanya mengimplementasikan server fungsi obrolan online: * Server mengimplementasikan bahwa informasi klien yang diterima diteruskan ke semua klien yang terhubung, dan memungkinkan klien untuk membaca informasi ini dan menampilkannya di area tampilan konten. * * @author tuzongxun123 * */ kelas publik chatserver {public static void main (string [] args) {new chatserver (). start (); } // Apakah server berhasil memulai boolean pribadi isStart = false; // Server Socket Private Serversocket SS = NULL; // soket klien soket pribadi = null; // Simpan Daftar Koleksi Klien <CLIPT> CLIENT = NEW ARRAYLIST <CLIPER> (); public void start () {coba {// mulai server ss = server baru (8888); } catch (BindException e) {System.out.println ("Port digunakan"); // Tutup program System.exit (0); } catch (Exception e) {E.PrintStackTrace (); } coba {isStart = true; while (isStart) {// Mulai soket mendengarkan = ss.accept (); System.out.println ("One Client Connect"); // Mulai klien utas klien klien = klien baru (soket); utas baru (klien) .start (); klien.add (klien); }} catch (Exception e) {e.printstacktrace (); } akhirnya {// tutup layanan coba {ss.close (); } catch (ioException e) {e.printstacktrace (); }}} / ** * utas klien * * @author tuzongxun123 * * / kelas privat mengimplementasikan runnable {// soket klien soket soket pribadi = null; // Stream Input Klien Private DataInputStream DataInputStream = null; // stream output klien Private DataOutputStream dataOutputStream = null; private boolean isConnect = false; klien publik (soket soket) {this.socket = socket; coba {isConnect = true; // Dapatkan klien input stream datalputStream = new DataInputStream (socket.getInputStream ()); // Dapatkan aliran output klien dataOutputStream = DataOutputStream baru (socket.getoutputStream ()); } catch (ioException e) {e.printstacktrace (); }} / ** * Bulk Send (Forward) Data ke Klien * * @Author: tuzongxun * @title: sendMessageToClients * @param @param * @return void * @Date 18 Mei 2016 (STRINGSTRICE (STRESSRITION (PRICTREOK (PRICTREOK (PRICTREOM PUBLIK. } catch (socketException e) {} catch (ioException e) {e.printstacktrace (); }} @Override public void run () {isConnect = true; Klien c = null; Coba {while (iSconnect) {// Baca data yang dilewati oleh klien string message = datalputStream.readutf (); System.out.println ("Klien mengatakan:" + pesan); untuk (int i = 0; i <client.size (); i ++) {c = client.get (i); C.SendMessageToclients (pesan); }}} catch (eOfException e) {System.out.println ("Klien Tertutup!"); } catch (socketException e) {if (c! = null) {client.remove (c); } System.out.println ("Klien ditutup !!!"); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {// tutup sumber daya yang relevan coba {if (datalputStream! = null) {datalputStream.close (); } if (socket! = null) {socket.close (); soket = null; }} catch (ioException e) {E.PrintStackTrace (); }}}}}}}}}}}}}}}}}}}}Mari kita perkenalkan kepada Anda terlebih dahulu, dan kemudian perbarui untuk Anda jika ada konten baru.
Mengenai realisasi fungsi obrolan online web, Anda juga dapat merujuk pada artikel berikut untuk belajar:
Java mengimplementasikan berbagi fungsi ruang obrolan tcpsocket sederhana
Di atas adalah semua konten artikel ini. Saya harap ini akan membantu untuk pembelajaran semua orang, dan saya harap Anda dapat terus memperhatikan konten yang lebih menarik dari wulin.com.