Lecture connexe: Programmation de la salle de chat java socket (ii) Utilisation de socket pour implémenter une salle de chat unique
Il existe déjà de nombreux exemples d'utilisation des sockets pour implémenter le chat sur Internet, mais j'en ai vu beaucoup, et il y a plus ou moins de problèmes.
Ici, je vais implémenter un exemple de chat relativement complet et expliquer la logique.
Étant donné que la prise est relativement grande, je diviserai quelques articles pour écrire un exemple de socket relativement complet.
Ici, nous implémentons d'abord la fonction la plus simple de la communication et du client du serveur-client pour réaliser la poussée du message.
Objectif: Le serveur établit une connexion avec le client. Le client peut envoyer des messages au serveur et le serveur peut pousser des messages au client.
1. Créez un serveur de chat à socket à l'aide de Java
1. SockUturls détermine l'adresse IP et le numéro de port
Classe publique SockUTURLS {// Adresse IP Public Final Static String IP = "192.168.1.110"; // Numéro de port public Final Static int port = 8888;}2. L'entrée du programme principal
classe publique Main {public static void main (String [] args) lève une exception {new ChatServer (). IniTServer ();}}3. Classe d'entités de haricot
UserInfobean
classe publique Main {public static void main (String [] args) lève une exception {new ChatServer (). IniTServer ();}}Chat MessageBean
classe publique MessageBean étend UserInfobean {private long messageId; // message idprivate long groupID; // groupe idprivate booléen isgoup; // si c'est un message de groupe private int chatType; // ERRORCODE; // Code d'erreur // OMIT GET / SET Méthode}4. Service de chat Chatserver, le programme le plus important
classe publique ChatServer {// Socket Service Private Static Serversocket Server; public gson gson = new GSON (); / *** Initialize Socket Service * / public void initsServer () {try {// Créer un servers de serve Catch Blocke.printStackTrace ();}} / *** Créer des messages Gestion et continuez à recevoir des messages * / private void CreateMessage () {try {System.out.println ("Waiting for User Access:"); // Utiliser accepter () pour bloquer et attendre les demandes du client Socket Socket = Server.Accept (); System.out.println ("User Access:" + socketport ();); thread pour attendre qu'une autre socket rejoigne un nouveau thread (new Runnable () {public void run () {CreateMessage ();}}). start (); // envoyer des informations au client OutputStream output = socket.getOutStream (); // obtenir des informations à partir du client BufferedReader BFF = new BuffereDer (New InputStreamReder (sanse new Scanner (socket.getInputStream ()); nouveau thread (new Runnable () {public void run () {try {String Buffer; while (true) {// entrent tamponreader à partir de la console strin = new Bufferreader (new InputStreamReader (System.in)); Buffer = Strin.readline (); // parce que Readline utilise une nouvelle ligne comme le point d'évaluation, ATTHALLINE (); // parce que Readline utilise un nouveau end + = "/n" socket while (true) {thread.sleep (500); // system.out.println ("contenu:" + bff.readline ()); // Obtenez les informations du client while ((line = bff.readline ())! = null) {messageBean MessageBean = gson.fromjson (line, message.class); System.out.out.PrintLn ("utilisateur:" + "+ MessageBean.getUsername ()); System.out.println ("Content:" + MessageBean.getContent ());}} // server.close ();} Catch (Exception e) {// TODO Generated Catch Blocke.printStackTrace (); System.out.println ("Error:" + E.getMessage ();2. Le côté Android est utilisé comme côté mobile pour se connecter au serveur
1. Applicement instancie un service de chat mondial
classe publique ChatAppLionction étend l'application {public static Chatserver Chatserver; public static userInfobean userInfobean; @OverRidePublic void onCreate () {super.oncreate ();}}2. L'adresse IP et le numéro de port sont cohérents avec le serveur
3. La force du chat est la même que le côté serveur
4. Disposition XML. Connectez-vous, chat
1. Connectez-vous
<? 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_parent" Android: orientation = "Vertical"> <editTextAndroid: "Match_parent" et LayOxt "Android: Layout_Width =" Match_parent "et LayOxt" Android: Layout_Width = "Match_parent" et LayOtex " 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 =" mot de passe "Android: text =" 123123123a "Android: InputType =" NumberPassword " /> <ButtonAndroid: id = "@ + id / chat_login_btn" Android: Layout_Width = "Match_parent" Android: Layout_Height = "Wrap_Content" Android: INTRY = "Login" /> </ linearlayout>
2. Chat
<? 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: Layout_Height = "match_parent" Android: Orientation = "Vertical" Tools: context = ". Activity.mainActivity"> <ScrollViewAndroid: id = "@ + id / scrollView" Android: Layout_Width = "Match_parent" Android: Layout_Height = "0DP" OID: id = "@ + id / chat_ly" Android: Layout_Width = "Match_parent" Android: Layout_Height = "Match_parent" Android: Orientation = "Vertical"> </ linearlayout> </ ScrollView> <linearlayoutAndroid: Layout_Width = "Match_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: Layout_Weight =" 0,8 " /><buttonandroid:id="@+id/send_btn"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="0.
5. Connexion de la connectivité
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 _ MainActivity.class);startActivity(intent);finish();}}});}private boolean getLogin(String name, String pwd) {if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) return false;if (name.equals("admin") && pwd.equals("123123123a")) return true;return false;} private void getChatServer () {ChatAppLiaCTION.ChatServer = new ChatServer ();}}6. Chat MainActivity
classe publique MainActivity étend AppCompatActivity {private linearlayout chat_ly; private textView Left_text, droite_view; editText privé Chat_et; bouton privé Send_BTn; private ViewGroup.LayoutParams LayoutParams = new ViewGroup.LayoutParams (ViewGroup.LayoutParams.match_Parent. onCreate (bundle SavedInStanceState) {super.onCreate (SavedInstanceState); setContentView (r.layout.activity_main); chat_ly = (linearlayout) findviewbyid (r.id.chat_ly); findViewByid (r.id.send_btn); send_btn.setOnClickListener (new View.OnClickListener () {@OverRidePublic void onClick (View v) Gens {@OverRidePublic void handleMessage (message msg) {if (msg.what == 1) {// Après avoir renvoyé le message, mettez à jour uichat_ly.addview (initleftView (msg.obj.tostring ()));}}});} / ** Message vers la droite * @param messagecont * @ return * / privil MessageContent) {right_view = new TextView (this); right_view.setLayoutParams (LayoutParams); droite_view.setGravity (return.focus_right); right_view.settext (MessageContent); return * / private = new TextView (this); Left_text.setLayoutParams (LayoutParams); Left_text.setGravity (View.focus_left); Left_text.setText (MessageContent); return Left_text;}}7. Logique de chat Chatserver, la plus importante
classe publique ChatServer {socket private socket; Handler privé Handler; private MessageBean MessageBean; private gson gson = new GSON (); // obtient le flux de sortie de l'objet Socket et construisez l'objet Printwriter Printwriter Printwriter; InputStream INPUT; Outporestream Output file d'attente, 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çoile ();} / *** Initialize Informations utilisateur * / private Void InitMessage () {MessageBean = new MessageBean (); MessageBean.SetUserId (1); MessageBean.SetMessageId (1); MessageBean.SetchAtType (1); MessageBean.SetUserName ("Admin"); ChatAppLionction.UserRinfobean = MessageBean;} / *** Envoyer un message ** @param contenu == null) {message message = handler.obtainmesage (); message.what = 1; message.obj = "le serveur a été fermé"; handler.sendMessage (message); return;} byte [] str = contentmsg.getBytes ("utf-8"); // Tourne le contenu utf-8string aaa = new String (str); MessageBean.setContent (aaa); gson.tojson (MessageBean); / *** Parce que le ReadLine () sur le serveur bloque la lecture * S'il ne peut pas lire le caractère Newline ou que le flux de sortie se termine, il y sera bloqué * Donc, un caractère Newline est ajouté à la fin du message JSON pour dire au serveur que le message a été envoyé * * / Messagejson + = "/n"output.write(MessageJson.getbytes. imprimer output.flush (); // 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, dans l'enfant thread * / private void receivEssage () {ent 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); message message = handler.obtainmesage (); message.obj = ligne; message.what = 1; handler.sendMessage (message);} if (socket == null) pause;} output.close (); // clôture sort de sortie Stream input.close (); // clôture de socket socket socket (); // {e.printStackTrace (); log.e ("test", "erreur:" + e.toString ());}}}). start ();}}}Soit dit en passant, tout le code a été achevé.
Cette démo peut permettre au téléphone mobile d'envoyer des messages au serveur et au serveur au téléphone mobile.
Cette démo peut être considérée comme une fonction push, mais la vraie poussée n'est pas si simple. En tant que débutant de sockets, vous pouvez voir les idées de la programmation de socket.
Ce qui précède est la programmation Java Socket Chat Chat Room introduite par l'éditeur (1) pour utiliser Socket pour implémenter Push Message. 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!