Android聊天工具基于socket实现

2019-12-10 19:09:04王冬梅
易采站长站为您分析基于socket实现的一个简单的Android聊天工具,实现方法简单,具有一定的参考价值,感兴趣的朋友可以参考一下  

特简单, 没有数据库, 还没有处理各种异常。
登录:输入用户名点击的登录即可。
发送消息: 特定格式->toUser:message
1. 服务器:保存在线用户     

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. 服务器:一个简单的socket服务器     

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 mSocket;
 private Online mOnline;
 
 public Server(Socket socket) {
  mSocket = socket;
  mOnline = Online.getInstance();
 }
 
 @Override
 public void run() {
  try {
   BufferedReader reader = new BufferedReader(new InputStreamReader(
     mSocket.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();
 }
}