Im vorherigen Artikel haben wir mit Socket den Chat -Chat -Chat -Raum -Chat -Raum (1) zum Implementieren von Chat -Nachrichten -Pushs darüber gesprochen, wie Socket verwendet wird, um Nachrichten zwischen dem Server und dem Client zu übergeben, um den Zweck des Schiebens von Nachrichten zu erreichen. Als nächstes werde ich schreiben, wie der Server die Kommunikation zwischen dem Client und dem Client ermöglicht.
In der Tat soll eine Eins-zu-Eins-Chat-Kommunikation aufgestellt werden.
Es unterscheidet sich etwas von dem vorherigen Code, der den Nachrichtenschub implementiert hat, und es wurde darauf geändert.
Wenn die Methoden oder Klassen nicht erwähnt werden, sind sie genau die gleichen wie im vorherigen Artikel.
1. Ändern Sie die Entitätsklasse (die Entitätsklasse auf dem Server und Client ist gleich)
1. userInfobean -Benutzerinformationstabelle
public class userInfobean implementiert serialisierbar {private statische endgültige long serialversionuid = 2l; private long userId; // Benutzer idprivate String -Benutzername; // Benutzername private String -Likesame; // Spitzname private string userpwd; // Benutzerkennwort private String -Usicon; // Benutzer Avatar // Omit Get und Setzen Sie Methoden}}}}}}}}}}}}2. MessageBean Chat Informationstabelle
öffentliche Klasse MessageBean implementiert serialisierbar {private statische endgültige long serialversionuid = 1l; private long messageId; // message idprivate long GroupId; // Gruppen idprivate boolean isgoup; // Ob es sich Content Private Zeichenfolge Errormsg; // Fehlermeldung private int errorCode; // Fehlercode private int userID; // Benutzer idprivate int Freund; // Zielfreund idprivate messageFileBean chatfile; // Nachrichtenanhang // Verlassen Sie die Methoden aus und setzen3.. MessageFileBean Message Attachment Tabelle
öffentliche Klasse messageFileBean implementiert serialisierbar {private statische endgültige long serialversionUID = 3L; private int fileId; // Datei idprivate String -Dateiname; // Dateiname private lange Filength; // Dateilänge private Byte [] FileByte; // Dateiinhalte private String -Filetype; // Datei type private String -Filetitle; // Datei -Header -Header -Name // omit und set method |2. (Server -Seitencode -Änderung) ChatServer -Haupt -Chat -Dienstklasse, geändert
Public Class Chatserver {// Socket Service privater statischer ServerSocket -Server; // Verwenden Sie ArrayList, um alle SocketPublic -Liste zu speichern. HashMap (); public gson gson = new GSON ();/*** Initialisieren von Socket-Service*/public void InitServer () {try {// Erstellen Sie ein ServerSocket, um Kundenanfragen auf Port 8080 Server = New ServerSocket (Socketurls.Port) anzuhören; blocke.printstacktrace ();}}/*** Nachrichtenverwaltung erstellen und empfangen weiterhin Nachrichten*/private void createmessage () {try {system.out.println warten ("Warten auf Benutzerzugriff:"); // Verwenden Sie Akzeptieren (), um auf Kundenanforderungen zu warten. SocketList.Add (Socket); System.out.println ("Benutzerzugriff:" + socket.getPort ()); // einen untergeordneten Thread öffnen, um auf einen anderen Socket zu warten, um einen neuen Thread (neu Runnable () {public void run () {// Erstellen eines Socket -Dienstes Erstellen eines Softs -Dienstes, der darauf wartet, dass andere Benutzer auf die Kreaturen zuzugreifen (). Informationen aus dem Client BufferedReader BFF = New BufferedReader (neuer InputStreamReader (Socket.GetInputStream ()); // Lesen Sie die gesendete Serverinformation String -Zeile = NULL; // Looping, um Nachrichten aus dem aktuellen Socket (True) {Thread.Sleep (500); // system zu empfangen. = bff.readline ())! Die Benutzer -ID wird als Referenz -SetChatMap (MessageBean, Socket) verwendet; // Die vom Benutzer an den Zielfreund gesendete Nachricht weiterleiten. server.close ();} catch (Ausnahme E) {// Todo automatisch generiert blocke.printstacktrace (); system.out.println ("Fehler:" + e.getMessage ());}}/*** Senden Sie eine Nachricht*/private void GetMessage () {New Thread (New Thread (New Runnable) () {New Thread (New Runnable (). {// BufferedReader aus dem Konsolenstrin = neuer BufferedReader (neuer InputStreamReader (System.in)); Buffer = Strin.Readline (); // Weil Readline eine neue Linie verwendet, fügen Sie eine neue Linie hinzu. {OutputStream output = socket.getOutputStream (); output.write (buffer.getBytes ("utf-8"); // Data Output.flush ();}}} catch (ioException e) {// todo auto-generated catch bloze. und Speicher** @param messageBean* @param scoket*/private void setChatMap (MessageBean MessageBean, Socket Scoket) {// die Benutzerinformationen speichern, wenn (UsMap! getUserInfoBean(messageBean.getUserId()));}// Save the corresponding linked socket if (socketMap != null && socketMap.get(messageBean.getUserId()) == null) {socketMap.put(messageBean.getUserId(), scoket);}}/*** Simulate the user information of the database, create user information with different ids Hier** @param userId* @return*/private userInfobean getUserInfobean (int userId) {userInfobean userInfobean = new UserFobean (); userInfobean.setUSericon ("Benutzer Avatar");userInfoBean.setUserId(userId);userInfoBean.setUserName("admin");userInfoBean.setUserPwd("123123132a");return userInfoBean;}/*** Forward the message to the target friend* * @param messageBean*/private void getFriend(MessageBean messageBean) {if (socketMap != null && socketmap.get (messageBean.getFriendId ())! socket.getOutputStream();output.write(buffer.getBytes("utf-8"));// Send data output.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}3.. (Client -Code) Anmeldungs -Anmeldeseite der Anmeldung zur Anmeldung kann sich bei mehreren Personen anmelden
LoginActivity der öffentlichen Klasse erweitert AppCompatActivity {private editText chat_name_text, chat_pwd_text; private button chat_login_btn; @OverrideProtected void Oncreate (bündelte SavedInstancestate) {super.oncreate (SavedInstancEtate); (EditText) findViewById(R.id.chat_name_text);chat_pwd_text = (EditText) findViewById(R.id.chat_pwd_text);chat_login_btn = (Button) findViewById(R.id.chat_login_btn);chat_login_btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onclick (view v) {int status = getLogin (CHAT_NAME_TEXT.GETTEXT (). TOSTRING (). TRIM (), CHAT_PWD_TEXT.GETTEXT (). TOSTRING (). Trim (); if (status == -1 || status == == 0) {toastring () {toast.maketexte (Maketext (loginAnture), {toast. Toast.length_long) .show (); return;} getChatserver (getLogin (chat_name_text.getText (). ToString (). Trim (), chat_pwd_text.gettext (). ToString (). TRIM ()); MainActivity.class); StartActivity (Intent); Finish ();}});}/*** RETZEN SIE ZUM LINGELSCHAFT, 1 ist der Benutzer und 2 ist der andere Benutzer. Hier werden zwei Benutzer simuliert, um miteinander zu kommunizieren {return 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. (Clientcode) Änderung der Chatserver Chat -Service -Code -Logik
Public Class Chatserver {Private Socket Socket; Private Handler Handler; Private MessageBean MessageBean; private gson gson = new gson (); // den Ausgabestream aus dem Socket -Objekt abrufen und den Pressewriter -Objekt -Pressewriter -Printwriter -Input -Eingang konstruieren; OutputStream -Ausgabe; DataOutputStream DataOutputStream; öffentlicher Chatserver (Int -Status) (IntStream)) {initMessage (Status); Initchatserver ();}/*** Nachrichtenwarteschlange, verwendet, um Nachrichten zu übergeben. {messageBean = new messageBean (); userInfobean userInfobean = new UserInfobean (); userInfobean.setUserid (2); messageBean.setMessAnsId (1); MessageBean.setchattype (1); userInfobean.Setusername ("admin"); userInfobean.setuserpwd ("123123123a -uswace -uswace -ush -ush -ush -ush -ush -ush -ush -ush -ush -ush -uswdad a -ush. und der Chat -Ziel -Benutzer -IDIF (Status == 1) {// Wenn es Benutzer 1 ist, verweist er auf den Benutzer 2 auf Chat messageBean.setUserid (1); MessageBean.setfriendId (1);} chatappliaction.userinfobean = userInfobean;}/*** Senden Sie eine Nachricht ** @param contentsg*/public void sendMessage (String contentMSG) {try {if (socket == null) {message = Handler.obtaNMessMessSage (); geschlossen "; Handler.SendMessage (Nachricht); return;} byte [] str = contentsmsg.getBytes (" utf-8 "); // Konvertieren Sie den Inhalt in utf-8string aaa = new String (str); MessageBean.SetContent (AAA); String messagejson = gson.tojson (MessageBean);/*** Weil die Readline () auf dem Server das Lesen blockiert* Wenn er das Newline -Zeichen nicht lesen kann oder der Ausgabe -Stream endet, wird er blockiert. "/n";output.Write(Messagejson.getBytes("utf-8");// Print Newline Zeichenausgabe.flush (); // Aktualisieren Sie den Ausgabestream so, dass der Server die Zeichenfolge sofort empfängt} catch (Ausnahme E) {e.printstacktrace (); log.e ("test", "Fehler:" + e.toString ();}}}/*** Empfangen Sie die Nachricht und im untergeordneten Thread*/private void Receivemessage (). Client -Anforderung an den nativen Port 8080 Socket = neuer Socket (Socketurls.IP, Socketurls.Port); // Erhalten Sie den Eingabestream aus dem Socket -Objekt und konstruieren Sie den entsprechenden BufferedReader -Objekt Printwriter = new printwriter (SocketPutSputStream (); input = socket.getInputstream (). DataOutputStream (Socket.GetOutputStream ()); // Informationen aus dem Client BufferedReader bff = neuer BufferedReader (neuer InputStreamReader (input)); // Lesen Sie die gesendete Serverinformationslinie; + Zeile); MessageBean messageBean = gson.fromjson (Zeile, messageBean.class); Message Message = Handler.ObtainMessage (); Message.obj = messageBean.getContent (); message Socket Input Stream Socket.CLOSE (); // Socket schließen} catch (Ausnahme E) {e.printstacktrace (); log.e ("test", "Fehler:" + e.toString ());}}}). Start ();} öffentliche Socket getSocKt () {if (socket == null) return null;Auf diese Weise wurde die Codelogik aus der Logik des Nachrichtenschubs zur Logik des einzelnen Chats geändert.
Dieser Code ermöglicht Benutzer 1 und Benutzer 2, miteinander zu chatten, und der Server zeichnet den Chat -Verlauf zwischen ihnen auf. Und der Server hat auch die Funktion des Nachrichtenschubs.
Das obige ist die Java Socket Chat Room -Programmierung, die Ihnen vom Editor (ii) mit Socket vorgestellt wurde, um einen einzelnen Chatraum zu implementieren. Ich hoffe, es wird für alle hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird allen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!