Dalam artikel sebelumnya Java Socket Chat Room Programming (1) Menggunakan Socket untuk mengimplementasikan Pusat Pesan Obrolan, kami berbicara tentang cara menggunakan soket untuk membuat pesan berlalu antara server dan klien untuk mencapai tujuan mendorong pesan. Selanjutnya, saya akan menulis tentang cara mengaktifkan server untuk membangun komunikasi antara klien dan klien.
Bahkan, itu adalah untuk membangun komunikasi obrolan satu-ke-satu.
Ini agak berbeda dari kode sebelumnya yang menerapkan dorongan pesan, dan dimodifikasi di atasnya.
Jika metode atau kelas tidak disebutkan, mereka persis sama dengan artikel sebelumnya.
1. Modifikasi kelas entitas (kelas entitas di server dan klien adalah sama)
1. Tabel Informasi Pengguna UserInfobean
Public Class UserInfobean mengimplementasikan serializable {private static final long serialversionuid = 2l; private long userid; // user idprivate string username; // nama pengguna private string likeName; // nickname private string userpwd; // user password pribadi USERICON; // pengguna avatar // hilangkan get dan set metode}}}}}2. Tabel Informasi Obrolan Pesan
PUBLIK PUBLIC PesanBean mengimplementasikan serializable {private static final long serialversionuid = 1l; private long messageid; // pesan idprivate long groupId; // grup idprivate boolean isgoup; // apakah itu pesan grup content; // tipe pesan; 1, teks; 2, gambar; 3, video pendek; 4, file 5, 5, 5, 5, 5, geografi; errorrormsg; // pesan kesalahan private int errorCode; // kode kesalahan private int userid; // user idprivate int friendId; // target teman idprivate messageefileBean chatfile; // lampiran pesan // empuk dan atur metode}3. Tabel Lampiran MessageFilebean
kelas publik MessageFilebean mengimplementasikan serializable {private static final long serialversionuid = 3l; private int fileid; // file idprivate string fileName; // file nama private long filelength; // file panjang byte private [] file heade; // file head content private string filetype; // file tipe private string string private filetle;/fILebYTE;2. (Modifikasi Kode Sisi Server) Kelas layanan obrolan utama ChatServer, dimodifikasi
Kelas Publik ChatServer {// Socket Service Private Static Serversocket Server; // Gunakan ArrayList untuk Menyimpan Semua SocketPublic Daftar <Socket> SocketList = NEW ARRAYLIST <> (); // Imitasi Peta SocketPublic <Integer, Socket> DATETMAP = HASHMAP BARU (); //Imitate Informasi Pengguna, Socket> DATETMAP = HASHMAP NEWMAP ();// Imitate Informasi Pengguna, Socket> DATETMAP = HASHMAP NEWMAP ();// Imitate Informasi Pengguna, Socket> DATETMAP = HASHMAP NEWMAP ();/ Imitate Informasi Pengguna, new HashMap (); publik gson gson = baru gson ();/*** inisialisasi layanan soket*/public void initserver () {coba {// Buat server server untuk mendengarkan permintaan pelanggan pada port 8080 server = server new (socketurls.port); createMessage ();} server (ioExcepte (ioException E); createMessage ();} Catch (ioException E); create-createSage ();} Catch (ioExcepte E); create-createSage ();} Catch (ioExcepte E); create-createSage ();} Catch (ioExcepte E); create-createSo. blocke.printstacktrace ();}}/*** Buat manajemen pesan dan terus menerima pesan*/private void createMessage () {coba {System.out.println ("Menunggu akses pengguna:"); // gunakan penerimaan () untuk memblokir tunggu soket koleksi soket = server.accepcept (); // simpan socket yang tertaut untuk soket koleksi = server socketList.add(socket);System.out.println("User Access: " + socket.getPort());// Open a child thread to wait for another socket to join new Thread(new Runnable() {public void run() {// Create a socket service again waiting for other users to access createMessage();}}).start();// Used to push messages to the user getMessage();// Dapatkan informasi dari klien bufferedReader bff = baru buferedReader (inputStreamReader baru (socket.getInputStream ())); // Baca baris informasi server yang dikirim = null; // looping untuk menerima pesan dari soket saat ini (true) {thread. ((line = bff.readline ())! = null) {// Parse kelas entitas pesan pesanbean = gson.fromjson (line, messageBean.class); // Tambahkan informasi pengguna ke dalam peta, tiru ke dalam database dan memori // Kelas entitas disimpan dalam database dan habet yang ditstorum. ID Pengguna digunakan sebagai Referensi SetChatMap (MessageBean, Socket); // Teruskan pesan yang dikirim oleh pengguna ke teman target GetFriend (MessageBean); System.out.println ("Pengguna:" + UserMap.get (contest.getuserid ()). GetUserName ()); System.out.println ("Content:" oMerBeN () .geTBean (); System. server.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("Error: " + e.getMessage());}}/*** Send a message*/private void getMessage() {new Thread(new Runnable() {public void run() {try {String buffer; while (true) {// Masukkan BufferedReader dari konsol strin = BufferedReader baru (inputStreamReader baru (System.in)); buffer = strin.readline (); // Karena readline menggunakan garis baru sebagai titik akhir, tambahkan semua pengguna yang terhubung (socket: socket: socket: socket: socket: socket: socket: socket: socket: socket: socket: socket: socket for the server: socket: socket: socket for the server for the end (n "; // Di sini dimodifikasi untuk mendorong pesan ke semua pengguna) di akhir +"/n ";/ {OutputStream output = socket.getOutputStream (); output.write (buffer.getbytes ("utf-8")); // kirim data output.flush ();}}} catch (ioException e) {// todo}}}} {// todo} {) {// todo}; Database dan memori** @param MessageBean* @param scoket*/private void setChatMap (pesan pesan, socket scoket) {// simpan informasi pengguna jika (userMap! = null && userMap.get (messageBean.getUserId ()) == null) {usermap.put.put.put.put.puteD () == null) {usermap.put.put.put. getUserInfobean (messageBean.getUserId ()));} // simpan soket tertaut yang sesuai (socketMap! = null && socketmap.get (pesan Anda. di sini** @param userid* @return*/private userinfobean getUserInfobean (int userid) {userinfobean userinfobean = UserInfobean baru (); userinfobean.setusericon ("pengguna Avatar "); userinfobean.setuserid (userid); userinfobean.setusername (" admin "); userinfobean.setuserpwd (" 123123132a "); kembalikan non -non -non -non -non -bubur (mailsbean) pacaran {mailsbean) oageBean (macet -bubul {mage bubul {mage @privybean oMer -noure (macie bvoule (mage @proad wearbean* && socketMap.get (messageBean.getFriendId ())! = null) {socket socket = socketMap.get (messageBean.getFriendId ()); string buffer = gson.toJson (pesan Anda); // karena readline adalah titik akhir dengan newline, tambahkan buffer Newline di akhir +"/n"; socket.getOutputStream (); output.write (buffer.getBytes ("utf-8"))); // kirim data output.flush ();} catch (ioException e) {// TODO AUTO-ENTO-ENTOLATED Blocke.printStackTrace ();}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}3. (Kode Klien) Modifikasi halaman login LoginActivity dapat masuk ke banyak orang
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) {int status = getLogin (chat_name_text.getText (). Tostring (). Trim (), chat_pwd_text.getText (). ToString (). Trim ()); if (status == -1 || Toast.length_long) .show (); return;} getchatserver (getLogin (chat_name_text.getText (). Tostring (). Trim (), chat_pwd_text.getText (). ToString (). Trim ()); intent intent = new intent. MainActivity.class); startActivity (intent); finish ();}});}/*** Kembali ke status login, 1 adalah pengguna dan 2 adalah pengguna lain. Di sini, dua pengguna disimulasikan untuk berkomunikasi satu sama lain ** nama @param* @param pwd* @return*/private int getLogin (nama string, string pwd) {if (textutils.isempty (name) || textutils.isempty (pwd)) {return 0;//tidak ada kata sandi lengkap yang dimasukkan} name. 1;//User1} else if (name.equals("admin") && pwd.equals("2")) {return 2;//User2} else {return -1;//Password error}}/*** Instantiate a chat service** @param status*/private void getChatServer(int status) {ChatAppliaction.chatServer = new ChatServer(status);}}4. (Kode Klien) Modifikasi Logika Kode Layanan Obrolan CHATSERVER
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(int status) {initmessage (status); initchatserver ();}/*** antrian pesan, digunakan untuk menyampaikan pesan ** @param handler*/public void setChathandler (pawang pawang) {this.handler = handler;} private void initchatserver () {// thread terbuka untuk menerima pesan pesan (); {messageBean = new MessageBean();UserInfoBean userInfoBean = new UserInfoBean();userInfoBean.setUserId(2);messageBean.setMessageId(1);messageBean.setChatType(1);userInfoBean.setUserName("admin");userInfoBean.setUserPwd("123123123a");//The following Operasi meniru ketika pengguna mengklik antarmuka obrolan yang diperluas oleh teman, ID pengguna dan target obrolan IDIF pengguna (status == 1) {// Jika itu adalah pengguna 1, maka ia menunjuk ke pengguna 2 untuk obrolan pesan Anda. MessageBean.SetFriendId (1);} chatappliaction.userInfobean = userInfobean;}/*** Kirim pesan ** @param contentmsg*/public void sendmessage (string contentMsg) {coba {if (socket == null) {pesan pesan = handler.obtainmessage (); tertutup "; handler.sendMessage (pesan); return;} byte [] str = contentMsg.getbytes (" utf-8 "); // Konversi konten ke utf-8string aaa = string baru (str); MessageBean.SetContent (AAA); String MessageJson = gson.toJson (MessageBean);/*** Karena readline () pada server memblokir bacaan* jika tidak dapat membaca karakter baru atau aliran output berakhir, pesan itu akan diblokir di sana* sehingga karakter baru ditambahkan* pada akhir pesan JSON untuk memberi tahu bahwa pesan telah dikembangkan pesan itu telah dikuasai* "/n";output.write(messageJson.getbytes("utf-8"));// cetak output karakter baru.flush (); // Segarkan aliran output sehingga server menerima string segera} catch (Exception e) {e.printstacktrace (); log.e ("test", "error:" + e.tostring ());}}/*** Terima pesan dan dalam rune runeas*/private void receivemessage () {New Thread (New Runnable (New Runnable () {new runnable {) {new runnable {) {) {new runin {) {) {new runin {) {) {{) {{new runnab {) {new run {) {) {new runeR () {) {) {new rune. 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 baris informasi server yang dikirim (while) {thread.sleep (500); // Dapatkan informasi klien saat (line = bff. "Konten:" + baris); MessageBean MessageBean = gson.fromjson (line, messageBean.class); pesan pesan = handler.obtainmessage (); message.obj = messageBean.getContent (); message. input.close (); // tutup soket input aliran socket.close (); // tutup soket} catch (pengecualian e) {e.printstacktrace (); log.e ("test", "kesalahan:" + e.toString ());}} {). start ();} socket publik getSoCe ());}}). start ();} socket publik getsoCe ());}}). start ();} socket publik getSoCe ()); soket;}}}Dengan cara ini, logika kode telah dimodifikasi dari logika dorongan pesan ke logika obrolan tunggal.
Kode ini memungkinkan pengguna 1 dan pengguna 2 untuk mengobrol satu sama lain, dan server akan merekam riwayat obrolan di antara mereka. Dan server juga memiliki fungsi dorongan pesan.
Di atas adalah pemrograman ruang obrolan soket java yang diperkenalkan kepada Anda oleh editor (ii) menggunakan soket untuk mengimplementasikan satu ruang 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!