Dans l'article précédent, la programmation de la salle de chat Java Socket (1) Utilisation de socket pour implémenter la poussée de message de chat, nous avons expliqué comment utiliser Socket pour faire passer les messages entre le serveur et le client pour atteindre le but de pousser les messages. Ensuite, j'écrirai sur la façon d'activer le serveur pour établir la communication entre le client et le client.
En fait, il s'agit d'établir une communication de chat un à un.
Il est quelque peu différent du code précédent qui a implémenté la poussée de message, et il a été modifié dessus.
Si les méthodes ou classes ne sont pas mentionnées, elles sont exactement les mêmes que dans l'article précédent.
1. Modifier la classe d'entité (la classe d'entité sur le serveur et le client est la même)
1. Tableau d'informations utilisateur utilisateur
classe publique UserInfobean implémente Serializable {private static final long SerialVersionUID = 2l; private long userId; // user idPrivate String username; // Nom d'utilisateur String private lienName; // Nickname private String userpwd; user mot de passe utilisateur private String usericon; // user avatar // omit get et set méthodes} mot de passe user2. Table d'informations sur le chat MessageBean
classe publique MessageBean implémente sérialisable {private static final long SerialVersionUID = 1l; private long messageId; // message idprivate long groupId; // groupe idprivate booléan isgoup; // si c'est un message de groupe int chatType; // Content privé String errormsg; // Message d'erreur private int errorcode; // code d'erreur private int userId; // user idPrivate int amiid; // cible idprivate MessageFileBean chatfile; // mess jatthement // omit get and définir les méthodes}3. MessageFileBean Message Table
classe publique MessageFileBean implémente Serializable {private static final long SerialVersionUID = 3l; private int fileId; // file idprivate String fileName; // nom de fichier private long fileLength; // file longueur file private byte [] filebyte;2. (Modification du code côté serveur) Classe de service de chat principale de Chatserver, modifié
classe publique ChatServer {// Socket Service Private Static ServerSocket Server; // Utilisez ArrayList pour stocker toutes les listes de socketpublic <Socket> socketList = new ArrayList <> (); // imitation SocketPublic Map <Integer, socket> socketmap = new hashmap (); // imitation d'informations de l'utilisateur enregistrées dans la database MAP PUBUBER Hashmap (); public gson gson = new gson (); / *** initialize socket Service * / public void initserver () {try {// créer un serversocket pour écouter les demandes du client sur le port 8080 server = new serversock Blocke.printStackTrace ();}} / *** Créez la gestion des messages et continuez à recevoir des messages * / private void CreateMessage () {try {System.out.println ("Waiting to User Access:"); // Utiliser Accept () pour bloquer la collection des demandes du client socketList.add (socket); System.out.println ("User Access:" + socket.getport ()); // Ouvrez un fil d'enfant pour attendre qu'une autre socket rejoigne à nouveau un nouveau thread (New Runnable () pour accéder à CreateMessage ();}}). start /); Informations du client BufferedReader BFF = new BufferedReader (new InputStreamReader (socket.getInputStream ())); // Lire la chaîne d'informations envoyée = NULL; // LOOPing pour recevoir des messages de la prise actuelle tandis que (true) {Thread.Sleep (500); // System.out.Println ("Contenu:" + BFF.RF = bff.readline ())! = null) {// analyser la classe d'entité MessageBean MessageBean = gson.fromjson (Line, MessageBean.class); // Ajouter des informations de l'utilisateur dans la carte, l'imitez dans la base de données et la mémoire // La classe d'entité est stockée dans la base de données et la prise est stockée dans la mémoire. L'ID utilisateur est utilisé comme référence setChatmap (MessageBean, Socket); // transférer le message envoyé par l'utilisateur à l'ami cible Getfriend (MessageBean); System.out.println ("utilisateur:" + usermap.get (MessageBean.getUserrid (). GetUserName ()); System.out.println ("Contenu:" + MessageBean.getContent (); server.close ();} catch (exception e) {// TODO Generated Catch Blocke.printStackTrace (); System.out.println ("Error:" + e.getMessage ());}} / *** Envoyer un message * / private void getMessage () {New Thread (new Runnable () {public Void Run () {Try {while Buffer; {// Entrez BufferedReader à partir de la console strin = new BufferedReader (new InputStreamReader (System.in)); tamper = strin.readline (); // parce que ReadLine utilise une nouvelle ligne comme point final, ajoutez un nouveau tampon lié à la fin + = "/ n"; // Ici est modifié pour pousser à tous les utilisateurs connectés au serveur pour (socket: socket: sockets: sockets ()) {OutputStream output = socket.getOutputStream (); output.write (buffer.getBytes ("utf-8")); // Envoyer des données output.flush ();}}} Catch (ioException e) {// too Auto-Generated Catch Blocke.PrintStStackTrace ();}}}). Memory * * @param MessageBean * @param scoket * / private void setChatMap (MessageBean MessageBean, Socket Scoket) {// Enregistrer les informations de l'utilisateur if (userMap! = null && usermap.get (MessageBean.geTeserId ()) == Null) {userMap.Put (MessageBean.GetUserid (),, Null) {userMap.Put (MessageBean.GetUserid (),,, Null) {UserMap.Put (MessageBean.GetUserId (),,, Null) {UserMap.Put (MessageBean.GetUserrid (),,, Null) {UserMap.Put (MessageBean.GetUserId (),,, NULL) getUserIrinfobean (messageBean.getUserId ()));} // Enregistrez le socket lié correspondant if (socketmap! = null && socketmap.get (messageBean.geTeuserid ()) == null) {socketmap.put (messageBean.geTeuserid (), scopet);}}! Ici * * @param userId * @ return * / private userInfobean getUserInfobean (int userId) {userInfobean userInfobean = new UserInfoBean (); userInfObean.SetUtericon ("user Avatar "); userInfobean.SetUserId (userId); userInfObean.SetUserName (" admin "); userInfObean.SetUserPwd (" 123123132a "); retourner userInfobean;} / *** transférer le message à l'ami cible * * @Param MessageBean * / Private Vend Get Agrien && socketmap.get (MessageBean.getFriendId ())! = null) {socket socket = socketmap.get (messageBean.getFriendId ()); String Buffer = gson.tojson (messageBean); // parce que ReadLine est le point final avec un newline, ajoutez un buffer newline à la fin + = "/ n"; socket.getOutputStream (); output.write (buffer.getBytes ("utf-8")); // Envoyer des données output.flush ();} catch (ioException e) {// todo généré par Auto-généré Blocke.printStackTrace ();}}}}}}3. (Code client) La modification de la page de connexion de la connexion peut se connecter à plusieurs personnes
La classe publique LoginActivity étend AppCompatActivity {private edittext chat_name_text, chat_pwd_text; bouton privé Chat_login_btn; @OverrideProtected void onCreate (bundle savedInstanceState) {super.oncreate (SavEdInstancEstate); SetContentView (R.Layout.Activity_Login); CHAT_EXTE); (EditText) findViewByid (r.id.chat_name_text); chat_pwd_text = (editText) findViewByid (r.id.chat_pwd_tex {@OverRidePublic void onClick (voir v) {int status = getlogin (chat_name_text.getText (). ToString (). Trim (), chat_pwd_text.getText (). ToString (). Trim ()); if (status == -1 || status == 0) {toast.maketext (liginactivity. Toast.length_long) .show (); return;} getChatServer (getlogin (chat_name_text.getText (). ToString (). Trim (), chat_pwd_text.getText (). MainActivity.class); startActivity (intention); fini final ();}});} / *** retour à l'état de connexion, 1 est l'utilisateur et 2 est l'autre utilisateur. Ici, deux utilisateurs sont simulés pour communiquer entre eux ** @param nom * @param pwd * @ return * / private int getlogin (nom de chaîne, chaîne pwd) {if (textuls.isempty (name) || textutils.isempty (pwd)) {return 0; // non de mot de passe complet entré} else if (name.equal {return 1; // user1} else if (name.equals ("admin") && pwd.equals ("2")) {return 2; // user2} else {return -1; // error de mot de passe}} / *** instanciate un service de chat ** @param status * / private void Getchatsserver (intche) {CatAppLiaCTION.CHATSERS)4. (code client) Modification de la logique du code du service de chat ChatServer
classe publique ChatServer {private socket socket; Handler Private Handler; private MessageBean MessageBean; private gson gson = new GSON (); // obtenir le flux de sortie de l'objet Socket et construire l'objet Printwriter Printwriter Printwriter; InputStream INPUT) Outpstream Output File d'attente de messages, utilisé pour transmettre des messages ** @Param Handler * / public void SetChathandler (Handler Handler) {this.handler = Handler;} private void InitchatServer () {// ouvrir thread pour recevoir le message reçue ();} / *** Initialize Informations utilisateur * / Private Void InitMessage (int status) {messagesBean = new MessageBean (); Intermessage (int status) {newBean = news MessageBean (); Intermessage (int status) {newBean = New MessageBean (); Internet; UserInfobean (); userInfobean.SetUserId (2); MessageBean.SetMessageId (1); MessageBean.SetchAtType (1); userInfobean.SetUnName ("Admin"); userInfobean.SetUserpwd ("123123123a"); // l'opération suivante imite lorsque l'interface-chat est une interface de chat, l'opération suivante imite lorsque l'utilisateur clique sur une interface de chat par un ami par un ami, l'opération suivante imite lorsque l'utilisateur clique sur une interface de chat par un ami par un ami par un ami, l'opération suivante imite lorsque l'utilisateur clique sur l'interface A Friend By A Upred the Friend By a Adrowing Id id it imitea et l'utilisateur de la cible de chat IDIF (status == 1) {// Si c'est l'utilisateur 1, alors il pointe vers l'utilisateur 2 pour discuter MessageBean.SetUserId (1); MessageBean.SetFriendId (2);} else if (status == 2) {// Si c'est l'utilisateur 2, alors il pointera vers l'utilisateur 1 pour chatter MessageBean.SetErid (2); MessageBean.SetFriendId (1);} ChatAppLiacEction.UserInfobean = UserInfobean;} / *** Envoyer un message ** @param contentmsg * / public void SendMessage (String Contentm clôturé "; handler.sendMessage (message); return;} byte [] str = contentmsg.getBytes (" utf-8 "); // convertir le contenu en utf-8string aaa = new String (str); MessageBean.SetContent (AAA); String MessageJSon = GSON.Tojson (MessageBean); / *** Parce que le ReadLine () sur le serveur bloque la lecture * S'il ne peut pas lire le caractère Newline ou les extrémités du flux de sortie pour dire que le serveur a été envoyé * * / Messagejson + = "/n" // actualiser le flux de sortie afin que le serveur reçoive la chaîne immédiatement} catch (exception e) {e.printStackTrace (); log.e ("test", "error:" + e.toString ());}} / *** Recevoir le message et dans le thread enfant * / private void receivEssage () {{new runnable () {@OverRidEpubl Demande du client au port natif 8080 socket = new socket (socketUrls.ip, socketUrls.port); // Obtenez le flux d'entrée de l'objet Socket et construisez l'objet BuffereDreder correspondant Printwriter = new printwriter (socket.getoutputStream (); entrée = socket.getStream = new DataOutputStream (socket.getOutputStream ()); // Obtenez des informations du client BufferedReader BFF = new BufferedReader (New InputStreamReader (Input)); // Lire la ligne de chaîne d'informations du serveur envoyé; + Line); messageBean messageBean = gson.fromjson (Line, MessageBean.class); message message = handler.obtainMessage (); message.obj = messageBean.getContent (); message.what = 1; handler.sendMessage (message);} if (socket == null) Break Socket d'entrée socket.close (); // clôture socket} catch (exception e) {e.printstackTrace (); log.e ("test", "error:" + e.toString ());}}}). Start ();} public socket getSocekt () {if (socket == null) return null; socket de retour getSocekt;}}}De cette façon, la logique de code a été modifiée de la logique de la poussée de message à la logique du chat unique.
Ce code permet à l'utilisateur 1 et à l'utilisateur 2 de discuter les uns avec les autres, et le serveur enregistrera l'historique de chat entre eux. Et le serveur a également la fonction de push de messages.
Ce qui précède est la programmation de salle de chat Java Socket vous présentée par l'éditeur (ii) en utilisant Socket pour implémenter une seule salle de chat. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!