SoFunction
Updated on 2025-04-05

Android chat tool is implemented based on socket

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&lt;Map&lt;String, String&gt;&gt; mData = new ArrayList&lt;Map&lt;String, String&gt;&gt;();
 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&lt;String, String&gt; temp = new HashMap&lt;String, String&gt;();
   ("user", user);
   ("msg", msg);
   ("pos", "right");
   (temp);
   ();
  }
 }
  
 private class SendListener implements  {
  @Override
  public void onSend(String[] msg) {
   Map&lt;String, String&gt; temp = new HashMap&lt;String, String&gt;();
   ("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.