Bacaan Terkait: Pemrograman Ruang Obrolan Java Socket (II) Menggunakan Soket Untuk Mengimplementasikan Ruang Obrolan Tunggal
Sudah ada banyak contoh menggunakan soket untuk mengimplementasikan obrolan di internet, tetapi saya telah melihat banyak dari mereka, dan ada lebih banyak atau lebih sedikit masalah.
Di sini saya akan menerapkan contoh obrolan yang relatif lengkap dan menjelaskan logika di dalamnya.
Karena soketnya relatif besar, saya akan membagi beberapa artikel untuk menulis contoh soket yang relatif lengkap.
Di sini pertama-tama kami menerapkan fungsi paling sederhana dari komunikasi server-klien dan klien untuk mewujudkan dorongan pesan.
Tujuan: Server membuat koneksi dengan klien. Klien dapat mengirim pesan ke server, dan server dapat mendorong pesan ke klien.
1. Buat server obrolan soket menggunakan java
1. SocketUrls menentukan alamat IP dan nomor port
Public Class SocketUrls {// Alamat IP String Statis Akhir Publik IP = "192.168.1.110"; // Port Nomor Port Static Static Int Port = 8888;}2. Pintu masuk ke program utama
kelas publik utama {public static void main (string [] args) melempar pengecualian {new chatserver (). initserver ();}}3. Kelas Entitas Kacang
Userinfobean
kelas publik utama {public static void main (string [] args) melempar pengecualian {new chatserver (). initserver ();}}Obrolan pesan
Pesan Public ClassBean memperluas userInfobean {private long messageid; // pesan idprivate long groupid; // grup idprivate boolean isgoup; // apakah itu pesan grup private int chattype; // jenis pesan; 1, teks; 2, gambar; 3, video pendek; 4, file; 5, lokasi geografis; 6, 6, 7, konten private konten private; ERRORCODE; // Kode Kesalahan // Omit Get/Set Metode}4. Layanan obrolan chatserver, program terpenting
Kelas Publik ChatServer {// Socket Service Private Static Server Server Server; Publik GSON GSON = GSON baru ();/*** Inisialisasi Layanan Socket*/public void initserver () {coba {// Buat server untuk mendengarkan permintaan pelanggan di port 8080 server = server baru (socketurls.port); Tangkapan yang dihasilkan secara otomatis blocke.printstacktrace ();}}/*** Buat manajemen pesan dan tetap menerima pesan*/private void createMessage () {coba {System.out.println ("Menunggu akses pengguna:"); // Gunakan AcCECT () untuk memblokir dan menunggu permintaan klien socket socket = server.accept (); socket.getport ()); // buka utas anak untuk menunggu soket lain untuk bergabung dengan utas baru (runnable baru () {public void run () {createMessage ();}}). start (); // kirim informasi ke klien outputStream output = breadrerer (); InputStreamReader (socket.getInputStream ())); // scanner scanner = pemindai baru (socket.getInputStream ()); utas baru (runnable baru () {public void run () {cobalah {string buffer; while (true) {// masukkan bufferedReader dari console strin = Buffer; = strin.readline (); // Karena readline menggunakan garis baru sebagai titik akhir, tambahkan buffer garis baru di akhir += "/n";output.write(buffer.getbytes("utf-8") blocke.printstacktrace ();}}}). start (); // Baca baris informasi server yang dikirim = null; // loop terus menerima pesan dari soket saat ini (true) {thread.sleep (500); // system.out.println ("konten:" + bff.readline ()); null) {MessageBean MessageBean = gson.fromjson (line, messageBean.class); System.out.println ("User:" + MessageBean.getUserName ()); System.out.println ("Content:" + MessageBean.getContent ());}}}} {}; blocke.printstacktrace (); System.out.println ("Kesalahan:" + e.getMessage ());}}}2. Sisi Android digunakan sebagai sisi seluler untuk terhubung ke server
1. Appliaction membuat layanan obrolan global
Public Class ChatAppliaction memperluas aplikasi {public static chatserver chatserver; public static userinfobean userinfobean; @Overridepublic void onCreate () {super.onCreate ();}}2. Alamat IP dan nomor port konsisten dengan server
3. Kekuatan obrolan sama dengan sisi server
4. Tata letak XML. Masuk, mengobrol
1. Masuk
<? 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 sewa "android: orientasi =" vertikal "> <editTextAndroid: id ="@+id/chat_name_text "android: layout_width =" match_parent "android: layou t_height = "wrap_content" android: hint = "username" android: text = "admin"/> <editTextAndroid: id = "@+id/chat_pwd_text" android: layout_width = " Match_Parent "Android: layout_height =" wrap_content "android: hint =" kata sandi "android: text =" 123123123a "android: inputType =" numberpassword " /> <ButtonAndroid: id = "@+id/chat_login_btn" android: layout_width = "match_parent" android: layout_height = "wrap_content" android: hint = "login"/> </linearlayout>
2. Obrolan
<? Xml Version = "1.0" encoding = "UTF-8"?> <linearlayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" android: layout_width = "match_parent" android: tata letak_height = "parent_parent =" ori ori ori ori oriation = Alat "Vertikal": Context = ". Activity.MainActivity"> <scrollviewAndroid: id = "@+id/scrollview" android: layout_width = "match_parent" android: layout_height = "0dp" android: layout_weight = "0.9"> <linearlayoutandr OID: id = "@+id/chat_ly" android: layout_width = "match_parent" android: layout_height = "match_parent" android: orientation = "vertikal"> </ linearlayout> </scrollview> <linearlayoandroid: layout_width = "mooth_par ENT "Android: layout_height =" wrap_content "android: orientation =" horizontal "> <editTextAndroid: id ="@+id/chat_et "android: layout_width =" 0dp "android: layout_height =" match_parent "android: tata letak_weight =" 0.8 " /><buttonandroid:id="@+id/send_btn"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="0.2"android:text="send "/</linearlayout> </linearlllayout>
5. LoginActivity Login
public class LoginActivity extends AppCompatActivity {private EditText chat_name_text, chat_pwd_text;private Button chat_login_btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);chat_name_text = (EditText) findViewById (r.id.chat_name_text); chat_pwd_text = (editText) findViewById (r.id.chat_pwd_text); chat_login_btn = (tombol) (r.id.chat_login_btn); chatin_logener (r.idn.chat_login_btn); chatin_logenener (r.idn.chat_login_btn); chatin_logenener (r.idn.chat_login_btn); chatin_logenener (r.idn.chat_login_btn); chatin_loger.log. {@OverridEpublic void onClick (view v) {if (getLogin (chat_name_text.getText (). Tostring (). Trim (), chat_pwd_text.getText (). Intent intent (). Trim ()) {getchatserver (); new intent = intent = new intent (). Trim ()) {getchatserver (); intent intent = intent =). MainActivity.class); startActivity (intent); finish ();}}});} private boolean getLogin (nama string, string pwd) {if (textutils.isempty (name) || textutils.isempty (pwd)) return false; if (name. name. false;} private void getChatserver () {chatappliaction.chatserver = new chatserver ();}}6. Obrolan MainActivity
public class MainActivity extends AppCompatActivity {private LinearLayout chat_ly;private TextView left_text, right_view;private EditText chat_et;private Button send_btn;private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, Viewgroup.layoutparams.wrap_content);@overrideprotected void onCreate (bundle savedInstanceState) {super.onCreate (savedInstanceState); setContentView (r.layout.activity_main); chat_ly = (linearlayout) findviewbyid (r.); r.); chat_ly = (linearlayout) findviewbyid (r.); r.); chat_ly = (linearlayout) findviewbyid (r.); r.); chat_ly = (linearlayout) findviewbyid (r.); r.); chat_ly = (linearlayout) findviewbyid (r.); r.); chat_ly = (linearlayout) findviewbyid (r.) findViewById (r.id.chat_et); send_btn = (tombol) findViewById (r.id.send_btn); send_btn.setOnclickListener (view.onClickListener () {@overridepublic void onclick (view v) {Chatappliaction.catserver.sendMessage (chat_et.getText (). ToString (). Trim ()); chat_ly.addview (initrightView (chat_et.getText (). ToString (). Trim ());}}); // tambahkan pesan queuving (). Trim ()));}}); // penerima pesan queuving (). {@OverridEpublic void handlemessage (pesan msg) {if (msg.what == 1) {// Setelah mengirim kembali pesan, perbarui uichat_ly.addview (initleftView (msg.obj.tostring ()));}}});} pesan ke kanan ** @paren ());}}}); MessageContent) {right_view = new TextView (this); right_view.setLayoutParams (layoutparams); right_view.setGravity (view.focus_right); right_view.settext (messageContent); return right_view;}/** pesan di kiri (messageContent); return right_view;}/** pesan di sebelah kiri (messageContent); return right_view;}/** pesan di kiri (leftageContent); return right_view;}/** pesan di sebelah kiri*@par @pare* MessageContent) {left_text = TextView baru (this); left_text.setLayoutParams (LayoutParams); left_text.setGravity (view.focus_left); left_text.settext (MessageContent); return left_text;}}7. Logika obrolan chatserver, yang paling penting
public class ChatServer {private Socket socket;private Handler handler;private MessageBean messageBean;private Gson gson = new Gson();// Get the output stream from the Socket object and construct the PrintWriter object PrintWriter printWriter;InputStream input;OutputStream output;DataOutputStream dataOutputStream;public ChatServer() {initmessage (); initchatserver ();}/*** Antrian pesan, digunakan untuk menyampaikan pesan ** @param handler*/public void setChathandler (handler handler) {this.handler = handler;} void private initchatserver () {// buka utas untuk menerima resep pesan (); = MessageBean baru (); MessageBean.setUserId (1); MessageBean.setMessageId (1); MessageBean.SetchatType (1); MessageBean.setusername ("Admin"); chatappliaction.userinfobean = pesan void;}/*** Kirim pesan ** @param contentMsg*publicsm/publicsm; null) {pesan pesan = handler.obtainmessage (); message.what = 1; message.obj = "server telah ditutup"; handler.sendMessage (pesan); return;} byte [] str = contentmsg.getbytes ("utf-8"); // putar konten utf-8string aaa = noela ("aftonon (uMSet (uTf-8"); // ucm-mage ("UTF-8"); = gson.toJson (pesan);/*** Karena readline () pada server memblokir pembacaan* jika tidak dapat membaca karakter garis baru atau aliran output berakhir, itu akan diblokir di sana* sehingga karakter baru ditambahkan pada akhir pesan JSON untuk memberi server bahwa pesan tersebut telah dikirim**/MessageJson += "/n. output cetak newline.flush (); // refresh the output stream so that the Server receives the string immediately} catch (Exception e) {e.printStackTrace();Log.e("test", "Error:" + e.toString());}}/*** Receive the message, in the child thread */private void receiveMessage() {new Thread(new Runnable() {@Overridepublic void run() {try {// Kirim permintaan klien ke port asli 8080 soket = soket baru (socketurls.ip, socketurls.port); // Dapatkan aliran input dari objek soket dan konstruk objek bufferedreader printwriter yang sesuai = printwriter (socket.getoutputStream ()); input = socket.getinputStream (); output = output = output = output = output = output = output = output = output (); DataOutputStream (socket.getoutputStream ()); // Dapatkan informasi dari klien bufferedReader bff = baru buferedReader (inputStreamReader baru (input)); // Baca informasi string informasi server yang dikirim; "Konten:" + baris); pesan pesan = handler.obtainmessage (); message.obj = line; message.what = 1; handler.sendMessage (pesan);} if (socket == null) break;} output.close (); // tutup socket stream input. {e.printstacktrace (); log.e ("test", "error:" + e.toString ());}}}). start ();}}}Ngomong -ngomong, semua kode telah selesai.
Demo ini dapat mengaktifkan ponsel untuk mengirim pesan ke server dan server ke ponsel.
Demo ini dapat dianggap sebagai fungsi push, tetapi dorongan sebenarnya tidak sesederhana itu. Sebagai pemula soket, Anda dapat melihat ide -ide pemrograman soket.
Di atas adalah pemrograman ruang obrolan soket java yang diperkenalkan oleh editor (1) untuk menggunakan soket untuk menerapkan dorongan pesan obrolan. Saya harap ini akan membantu semua orang. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas semua orang tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!