Android聊天工具基于socket实现

2019-12-10 19:09:04王冬梅

6. 发送消息     

public class SendMessage {
 private OnSendListener mListener;
  
 public void setOnSendListener(OnSendListener listener) {
  mListener = listener;
 }
  
 private Handler mHandler = new Handler() {
  public void handleMessage(Message msg) {
   mListener.onSend((String[]) msg.obj);
  };
 };
  
 // 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();
     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. 接收消息,死循环,但阻塞,没啥问题     

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[]) msg.obj;
   mListener.onReceiver(cmds[0], cmds[1]);
  };
 };
  
 public void run() {
  new Thread(new Runnable() {
   @Override
   public void run() {
    try {
     Socket socket = PConnection.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();
      }
     }
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }).start();
 }
  
 public interface OnReceiverListener {
  public void onReceiver(String user, String msg);
 }
}