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.