Android Chat tool based on socket implementation _android

Source: Internet
Author: User
Tags readline socket

It's simple, there's no database, and there's no handling of exceptions.
Login: Enter user name click on login.
Send message: Specific format->touser:message
1. Server: Save online users

public class Online {
 private static online monline = null;
 Private linkedhashmap<string, socket> monlines = new linkedhashmap<string, socket> ();
  
 Private Online () {
 } public
  
 synchronized static online getinstance () {
  if (null = = Monline) {
   monline = new Online ();
  }
   
  return monline;
 }
  
 public void put (String key, socket socket) {
  if (!monlines.containskey (key)) {
   monlines.put (key, socket);
  }
 }
  
 Public Socket get (String key) {return
  monlines.get (key);
 }
  
 public void Remove (String key) {
  monlines.remove (key);
 }
}

2. Server: A simple socket server

Import Java.io.BufferedReader;
Import java.io.IOException;
Import Java.io.InputStreamReader;
Import Java.io.PrintWriter;
Import Java.net.ServerSocket;
 
Import Java.net.Socket; Login:uid//send:fromuser:touser:message//Logout:uid public class Server implements Runnable {private Socket Msock
 Et
 
 Private Online Monline;
  Public Server (socket socket) {msocket = socket;
 Monline = Online.getinstance (); @Override public void Run () {try {BufferedReader reader = new BufferedReader (new InputStreamReader) (MSOC
   Ket.getinputstream ()));
    
   String cmd = Reader.readline ();
    Login if (cmd.startswith ("login")) {String userName = Cmd.split (":") [1];
    Monline.put (UserName, Msocket);
     
    System.out.println (userName + "login ...");
    PrintWriter writer = new PrintWriter (Msocket.getoutputstream ());
    WRITER.PRINTLN ("Success");
   Writer.flush ();
    else if (Cmd.startswith ("send")) {System.out.println (cmd); string[] Cmds = Cmd.split (":");
    String from = cmds[1];
    Socket to = Monline.get (cmds[2]);
 
    String msg = cmds[3];
    PrintWriter writer = new PrintWriter (To.getoutputstream ());
     
    System.out.println ("Rec:" + from + ":" + cmds[2] + ":" + msg);
    Writer.println ("Rec:" + from + ":" + cmds[2] + ":" + msg);
   Writer.flush ();
     
    }else if (Cmd.startswith ("logout")) {System.out.println (cmd);
    String user = Cmd.split (":") [1];
    Monline.get (user). Close ();
     
    Monline.remove (user);
    PrintWriter writer = new PrintWriter (Msocket.getoutputstream ());
    WRITER.PRINTLN ("Success");
   Writer.flush ();
  } catch (Exception e) {e.printstacktrace ();
  } public static void Main (string[] args) throws Exception {ServerSocket server = new ServerSocket (8888);
  Boolean flag = true;
   while (flag) {New Thread (new Server (Server.accept ())). Start ();
  System.out.println ("User in ...");
 } server.close (); }
}

3. Client Login Interface

public class Mainactivity extends activity {
 private edittext muser;
  
 @Override
 protected void onCreate (Bundle savedinstancestate) {
  super.oncreate (savedinstancestate);
  Setcontentview (r.layout.activity_main);
   
  Muser = (edittext) Findviewbyid (r.id.username);
 }
  
 public void Login (view view) {
  final String userName = Muser.gettext (). toString (). Trim ();
  Login login = new Login (userName);
  Login.setonloginlistener (New Login.logincallback () {
   @Override public
   void Onlogin (Boolean success) {
    if (success) {
     Intent Intent = new Intent (mainactivity.this, chat.class);
     Intent.putextra ("User", userName);
     StartActivity (intent);
     Finish ();
    } else {
     Toast.maketext (mainactivity.this, Login failed, toast.length_short). Show ();}}
  ;
   
  Login.login ();
 }

4. Process Login

public class Login {private String musername;
  
 Private Logincallback Mcallback;
 Public Login (String userName) {musername = UserName;
 public void Setonloginlistener (Logincallback callback) {mcallback = callback;  Private Handler Mhandler = new Handler () {public void Handlemessage (msg) {switch (msg.what) {case
    Constant.SUCCESS:mCallback.onLogin (TRUE);
   Break
    Case Constant.FAILED:mCallback.onLogin (FALSE);
   Break
 }
  };
  
 };
    public void Login () {New Thread (new Runnable () {@Override public void run () {socket socket = NULL;
     try {socket = new socket ();
     Socket.connect (New Inetsocketaddress ("192.168.100.100", 8888), 4000);
     PrintWriter writer = new PrintWriter (Socket.getoutputstream ());
     WRITER.PRINTLN ("Login:" + musername);
      
     Writer.flush ();
     BufferedReader reader = new BufferedReader (New InputStreamReader (Socket.getinputstream ())); String line = Reader.readlINE ();
     System.out.println (line);
      if ("Success". Equals (line)) {pconnection.socket = socket;
     Mhandler.sendemptymessage (constant.success);
     }else {mhandler.sendemptymessage (constant.failed);
    }}catch (Exception e) {e.printstacktrace ();
 }}). Start ();
 Public interface Logincallback {public void Onlogin (Boolean success); }
}

5. Chat interface     

public class Chat extends activity {private String musername;
 Private EditText Medit;
  
 Private ListView mmessage;
 Private Receivermessage mrecmessage;
 Private SendMessage msendmesage;
 Private list<map<string, string>> mdata = new arraylist<map<string, string>> ();
  
 Private Messagesadapter Madapter;
  @Override protected void OnCreate (Bundle savedinstancestate) {super.oncreate (savedinstancestate);
   
  Setcontentview (r.layout.chat_layout);
  Musername = Getintent (). Getstringextra ("user");
  Medit = (edittext) Findviewbyid (R.id.edit);
   
  Mmessage = (ListView) Findviewbyid (r.id.message);
  Mrecmessage = new Receivermessage ();
  Mrecmessage.setonreceiverlistener (New Reclistener ());
   
  Mrecmessage.run ();
  Msendmesage = new SendMessage ();
   
  Msendmesage.setonsendlistener (New Sendlistener ());
  Madapter = new Messagesadapter (this, mdata);
 Mmessage.setadapter (Madapter); public void Send (view view) {string[] content = Medit.gettext (). toString (). Trim (). Split (":");
 Msendmesage.send (Musername, content[0], content[1]); Private class Reclistener implements Receivermessage.onreceiverlistener {@Override public void Onreceiver (Strin
   g user, String msg) {map<string, string> temp = new hashmap<string, string> ();
   Temp.put ("user", user);
   Temp.put ("msg", MSG);
   Temp.put ("pos", "right");
   Mdata.add (temp);
  Madapter.notifydatasetchanged ();  } Private class Sendlistener implements Sendmessage.onsendlistener {@Override public void OnSend (string[] msg)
   {map<string, String> temp = new hashmap<string, string> ();
   Temp.put ("User", "I");
   Temp.put ("MSG", msg[1]);
   Temp.put ("Pos", "left");
   Mdata.add (temp);
  Madapter.notifydatasetchanged (); @Override public boolean onoptionsitemselected (MenuItem item) {if r.id.logout = = Item.getitemid ()) {Logou
   T logout = new logout (); Logout.setonlogoutlistener (New Logout.onlogoutlistener () {@OverrIDE public void Onlogout (Boolean success) {if (success) {Toast.maketext (Chat.this, "Logoff succeeded", Toast.length_sh
      ORT). Show ();
     Finish ();
     }else {toast.maketext (Chat.this, logoff failed, Toast.length_short). Show ();
    
   }
    }
   });
  Logout.logout (Musername);
 return super.onoptionsitemselected (item);
  @Override public boolean Oncreateoptionsmenu (Menu menu) {getmenuinflater (). Inflate (R.menu.main, menu);
 return Super.oncreateoptionsmenu (menu); }
}

6. Send Message     

public class SendMessage {private Onsendlistener mlistener;
 public void Setonsendlistener (Onsendlistener listener) {Mlistener = listener;  Private Handler Mhandler = new Handler () {public void Handlemessage (msg) {Mlistener.onsend ((string[))
  Msg.obj);
 };
  
 }; Send:from:to:message public void Send (final string, final string, final string msg) {New Thread (new Runnab
    Le () {@Override public void run () {socket socket = NULL;
     try {socket = new socket ();
     Socket.connect (New Inetsocketaddress ("192.168.100.100", 8888), 4000);
     PrintWriter writer = new PrintWriter (Socket.getoutputstream ());
     Writer.println ("Send:" + from + ":" + to + ":" + msg);
      
     Writer.flush ();
      
     Message message = Mhandler.obtainmessage (constant.success, new string[] {to, msg});
    Message.sendtotarget ();
     catch (Exception e) {} finally {try {socket.close ();
    catch (IOException e) {  E.printstacktrace ();
 }}}). Start ();
 Public interface Onsendlistener {public void OnSend (string[] msg); }
}

7. Receiving messages, dead loops, but blocking, no problem     

public class Receivermessage {private Onreceiverlistener mlistener;
 public void Setonreceiverlistener (Onreceiverlistener listener) {Mlistener = listener; Private Handler Mhandler = new Handler () {public void Handlemessage (msg) {string[] Cmds = (string[))
   Msg.obj;
  Mlistener.onreceiver (Cmds[0], cmds[1]);
 };
  
 }; public void Run () {New Thread (new Runnable () {@Override public void run () {try {socket socket = Pconn
     Ection.socket;
      while (true) {System.out.println ("Wait for Message ...");
      BufferedReader reader = new BufferedReader (New InputStreamReader (Socket.getinputstream ()));
       
      String line = Reader.readline ();
       if (Line.startswith ("Rec")) {//rec:fromuser:touser:message string[] Cmds = Line.split (":");
       System.out.println (Cmds[0] + ":" + cmds[1] + ":" + cmds[2] + ":" + cmds[3]);
Message msg = Mhandler.obtainmessage (constant.success, new string[] {cmds[1], cmds[3]});       Msg.sendtotarget ();
    A catch (Exception e) {e.printstacktrace ());
 }}). Start ();
 Public interface Onreceiverlistener {public void Onreceiver (string user, string msg); }
}

8. Logout Login     

public class Logout {public Onlogoutlistener mlistener;
 public void Setonlogoutlistener (Onlogoutlistener listner) {mlistener = Listner; Private Handler Mhandler = new Handler () {public void Handlemessage (msg) {if (constant.success = Msg.
   What) {Mlistener.onlogout (true);
   }else {mlistener.onlogout (false);
 }
  };
  
 }; public void Logout (final String user) {new Thread (new Runnable () {@Override public void run () {try {S
     Ocket socket = new socket ();
     Socket.connect (New Inetsocketaddress ("192.168.100.100", 8888), 4000);
     PrintWriter writer = new PrintWriter (Socket.getoutputstream ());
     Writer.println ("Logout:" + user);
      
     Writer.flush ();
      
     BufferedReader reader = new BufferedReader (New InputStreamReader (Socket.getinputstream ()));
      if ("Success". Equals (Reader.readline ()) {pconnection.socket = null;
     Mhandler.sendemptymessage (constant.success); }else {Mhandler.Sendemptymessage (constant.failed);
    } catch (Exception e) {e.printstacktrace ();
 }}). Start ();
 Public interface Onlogoutlistener {public void Onlogout (Boolean success); }
}

9. Store the socket after login, use the socket when sending messages and receiving messages

public class Pconnection {public
 static socket socket;
}

I hope this article will help you to learn.

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.