Android中使用socket通信实现消息推送的方法详解

2019-12-10 18:13:05于海丽

效果图:

Android,socket,消息推送

MainActivity.java类:

package com.jimstin.socketclient; 
 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
 
import org.json.JSONObject; 
 
import com.tencent.stat.MtaSDkException; 
import com.tencent.stat.StatConfig; 
import com.tencent.stat.StatService; 
 
import android.R.integer; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.app.Activity; 
 
public class MainActivity extends Activity implements OnClickListener { 
 
  private EditText mIPEdt, mPortEdt, mSocketIDEdt, mMessageEdt; 
  private static TextView mConsoleTxt; 
   
  private static StringBuffer mConsoleStr = new StringBuffer(); 
  private Socket mSocket; 
  private boolean isStartRecieveMsg; 
   
  private SocketHandler mHandler; 
  protected BufferedReader mReader;//BufferedWriter 用于推送消息 
  protected BufferedWriter mWriter;//BufferedReader 用于接收消息 
   
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initView(); 
  } 
 
  private void initView() { 
    mIPEdt = (EditText) findViewById(R.id.ip_edt); 
    mPortEdt = (EditText) findViewById(R.id.port_edt); 
    mSocketIDEdt = (EditText) findViewById(R.id.socket_id_edt); 
    mMessageEdt = (EditText) findViewById(R.id.msg_edt); 
    mConsoleTxt = (TextView) findViewById(R.id.console_txt); 
    findViewById(R.id.start_btn).setOnClickListener(this); 
    findViewById(R.id.send_btn).setOnClickListener(this); 
    findViewById(R.id.clear_btn).setOnClickListener(this); 
    mHandler = new SocketHandler(); 
  } 
 
  /** 
   * 初始化socket 
   */ 
  private void initSocket() { 
    //新建一个线程,用于初始化socket和检测是否有接收到新的消息 
    Thread thread = new Thread(new Runnable() { 
       
      @Override 
      public void run() { 
        String ip = mIPEdt.getText().toString();//IP 
        int port = Integer.parseInt(mPortEdt.getText().toString());//Socket 
         
        try { 
          isStartRecieveMsg = true; 
          mSocket = new Socket(ip, port); 
          mReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "utf-8")); 
          mWriter = new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "utf-8")); 
          while(isStartRecieveMsg) { 
            if(mReader.ready()) { 
              /*读取一行字符串,读取的内容来自于客户机 
              reader.readLine()方法是一个阻塞方法, 
              从调用这个方法开始,该线程会一直处于阻塞状态, 
              直到接收到新的消息,代码才会往下走*/ 
              String data = mReader.readLine(); 
              //handler发送消息,在handleMessage()方法中接收 
              mHandler.obtainMessage(0, data).sendToTarget(); 
            } 
            Thread.sleep(200); 
          } 
          mWriter.close(); 
          mReader.close(); 
          mSocket.close(); 
        } catch (Exception e) { 
          e.printStackTrace(); 
        }  
      } 
    }); 
    thread.start(); 
  } 
   
  @Override 
  public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.send_btn: 
      send(); 
      break; 
    case R.id.clear_btn: 
      mConsoleStr.delete(0, mConsoleStr.length()); 
      mConsoleTxt.setText(mConsoleStr.toString()); 
      break; 
    case R.id.start_btn: 
      if(!isStartRecieveMsg) { 
        initSocket(); 
      } 
      break; 
    default: 
      break; 
    } 
  } 
 
  /** 
   * 发送 
   */ 
  private void send() { 
    new AsyncTask<String, Integer, String>() { 
 
      @Override 
      protected String doInBackground(String... params) { 
        sendMsg(); 
        return null; 
      } 
    }.execute(); 
  } 
  /** 
   * 发送消息 
   */ 
  protected void sendMsg() { 
    try { 
      String socketID = mSocketIDEdt.getText().toString().trim(); 
      String msg = mMessageEdt.getText().toString().trim(); 
      JSONObject json = new JSONObject(); 
      json.put("to", socketID); 
      json.put("msg", msg); 
      mWriter.write(json.toString()+"n"); 
      mWriter.flush(); 
      mConsoleStr.append("我:" +msg+"  "+getTime(System.currentTimeMillis())+"n"); 
      mConsoleTxt.setText(mConsoleStr); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
 
  static class SocketHandler extends Handler { 
     
    @Override 
    public void handleMessage(Message msg) { 
      // TODO Auto-generated method stub 
      super.handleMessage(msg); 
      switch (msg.what) { 
      case 0: 
        try { 
          //将handler中发送过来的消息创建json对象 
          JSONObject json = new JSONObject((String)msg.obj); 
          mConsoleStr.append(json.getString("from")+":" +json.getString("msg")+"  "+getTime(System.currentTimeMillis())+"n"); 
          //将json数据显示在TextView中 
          mConsoleTxt.setText(mConsoleStr); 
        } catch (Exception e) { 
          e.printStackTrace(); 
        } 
         
        break; 
 
      default: 
        break; 
      } 
    } 
  } 
   
  @Override 
  public void onBackPressed() { 
    super.onBackPressed(); 
    isStartRecieveMsg = false; 
  } 
   
  private static String getTime(long millTime) { 
    Date d = new Date(millTime); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    return sdf.format(d); 
  } 
   
}