It's very simple, there is no database, and various exceptions have not been processed.
Login: Enter the username and click on Login.
Send a 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(!(key)) { (key, socket); } } public Socket get(String key) { return (key); } public void remove(String key) { (key); } }
2. Server: a simple socket server
import ; import ; import ; import ; import ; import ; // login:uid // send:fromuser:touser:message // logout:uid public class Server implements Runnable { private Socket mSocket; private Online mOnline; public Server(Socket socket) { mSocket = socket; mOnline = (); } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader( ())); String cmd = (); // login if (("login")) { String userName = (":")[1]; (userName, mSocket); (userName + " login..."); PrintWriter writer = new PrintWriter(()); ("success"); (); } else if (("send")) { (cmd); String[] cmds = (":"); String from = cmds[1]; Socket to = (cmds[2]); String msg = cmds[3]; PrintWriter writer = new PrintWriter(()); ("rec:" + from + ":" + cmds[2] + ":" + msg); ("rec:" + from + ":" + cmds[2] + ":" + msg); (); }else if (("logout")) { (cmd); String user = (":")[1]; (user).close(); (user); PrintWriter writer = new PrintWriter(()); ("success"); (); } } catch (Exception e) { (); } } public static void main(String[] args) throws Exception { ServerSocket server = new ServerSocket(8888); boolean flag = true; while (flag) { new Thread(new Server(())).start(); ("user in..."); } (); } }
3. Client login interface
public class MainActivity extends Activity { private EditText mUser; @Override protected void onCreate(Bundle savedInstanceState) { (savedInstanceState); setContentView(.activity_main); mUser = (EditText) findViewById(); } public void login(View view) { final String userName = ().toString().trim(); Login login = new Login(userName); (new () { @Override public void onLogin(boolean success) { if(success) { Intent intent = new Intent(, ); ("user", userName); startActivity(intent); finish(); }else { (, "Login failed", Toast.LENGTH_SHORT).show(); } } }); (); } }
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(Message msg) { switch () { case : (true); break; case : (false); break; } }; }; public void login() { new Thread(new Runnable() { @Override public void run() { Socket socket = null; try { socket = new Socket(); (new InetSocketAddress("192.168.100.100", 8888), 4000); PrintWriter writer = new PrintWriter(()); ("login:" + mUserName); (); BufferedReader reader = new BufferedReader( new InputStreamReader(())); String line = (); (line); if("success".equals(line)) { = socket; (); }else { (); } }catch(Exception e) { (); } } }).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) { (savedInstanceState); setContentView(.chat_layout); mUserName = getIntent().getStringExtra("user"); mEdit = (EditText) findViewById(); mMessage = (ListView) findViewById(); mRecMessage = new ReceiverMessage(); (new RecListener()); (); mSendMesage = new SendMessage(); (new SendListener()); mAdapter = new MessagesAdapter(this, mData); (mAdapter); } public void send(View view) { String[] content = ().toString().trim().split(":"); (mUserName, content[0], content[1]); } private class RecListener implements { @Override public void onReceiver(String user, String msg) { Map<String, String> temp = new HashMap<String, String>(); ("user", user); ("msg", msg); ("pos", "right"); (temp); (); } } private class SendListener implements { @Override public void onSend(String[] msg) { Map<String, String> temp = new HashMap<String, String>(); ("user", "I"); ("msg", msg[1]); ("pos", "left"); (temp); (); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if( == ()) { Logout logout = new Logout(); (new () { @Override public void onLogout(boolean success) { if(success) { (, "Log out successfully", Toast.LENGTH_SHORT).show(); finish(); }else { (, "Logout failed", Toast.LENGTH_SHORT).show(); } } }); (mUserName); } return (item); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(, menu); return (menu); } }
6. Send a message
public class SendMessage { private OnSendListener mListener; public void setOnSendListener(OnSendListener listener) { mListener = listener; } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { ((String[]) ); }; }; // send:from:to:message public void send(final String from , final String to, final String msg) { new Thread(new Runnable() { @Override public void run() { Socket socket = null; try { socket = new Socket(); (new InetSocketAddress("192.168.100.100", 8888), 4000); PrintWriter writer = new PrintWriter(()); ("send:" + from + ":" + to + ":" + msg); (); Message message = ( , new String[] {to, msg}); (); } catch(Exception e) { } finally { try { (); } catch (IOException e) { (); } } } }).start(); } public interface OnSendListener { public void onSend(String[] msg); } }
7. Receive messages, a dead loop, 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(Message msg) { String[] cmds = (String[]) ; (cmds[0], cmds[1]); }; }; public void run() { new Thread(new Runnable() { @Override public void run() { try { Socket socket = ; while(true) { ("wait for message..."); BufferedReader reader = new BufferedReader( new InputStreamReader(())); String line = (); if(("rec")) { //rec:fromuser:touser:message String[] cmds = (":"); (cmds[0] + ":" + cmds[1] + ":" + cmds[2] + ":" + cmds[3]); Message msg = (, new String[] {cmds[1], cmds[3]}); (); } } } catch (Exception e) { (); } } }).start(); } public interface OnReceiverListener { public void onReceiver(String user, String msg); } }
8. Log out and log in
public class Logout { public OnLogoutListener mListener; public void setOnLogoutListener(OnLogoutListener listner) { mListener = listner; } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { if( == ) { (true); }else { (false); } }; }; public void logout(final String user) { new Thread(new Runnable() { @Override public void run() { try { Socket socket = new Socket(); (new InetSocketAddress("192.168.100.100", 8888), 4000); PrintWriter writer = new PrintWriter(()); ("logout:" + user); (); BufferedReader reader = new BufferedReader( new InputStreamReader(())); if("success".equals(())) { = null; (); }else { (); } } catch (Exception e) { (); } } }).start(); } public interface OnLogoutListener { public void onLogout(boolean success); } }
9. Store the logged-in socket and use the socket when sending and receiving messages
public class PConnection { public static Socket socket; }
I hope this article will be helpful to everyone's study.