1. 程式人生 > >Android IPC程序間通訊(六)Socket

Android IPC程序間通訊(六)Socket

網路通訊之Socket

特點:功能強大,可通過網路傳輸位元組流,支援一對多併發即時通訊。
不支援RPC。
服務端實現:

public class SorviceSocket extends Service {

    private static final String TAG = "SorviceSocket";
    private static final int PORT = 5000;
    private boolean mIsServiceDestory = false;


    @Nullable
    @Override
    public IBinder onBind
(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); new Thread(new MyRunnable()).start(); } @Override public void onDestroy() { super.onDestroy(); mIsServiceDestory = true; } private class MyRunnable
implements Runnable { @Override public void run() { serverReceviedByTcp(); } } public void serverReceviedByTcp() { // 宣告一個ServerSocket物件 ServerSocket serverSocket = null; try { // 建立一個ServerSocket物件,並讓這個Socket在5000埠監聽 serverSocket =
new ServerSocket(PORT); } catch (IOException e) { e.printStackTrace(); } //一直等待客戶端的連結 while (!mIsServiceDestory) { // 呼叫ServerSocket的accept()方法,接受客戶端所傳送的請求, // 如果客戶端沒有傳送資料,那麼該執行緒就停滯不繼續 try { final Socket socket = serverSocket.accept(); new Thread(new Runnable() { @Override public void run() { try { readAndWriteData(socket); } catch (IOException e) { e.printStackTrace(); } } }).start(); } catch (IOException e) { e.printStackTrace(); } } } private void readAndWriteData(Socket socket) throws IOException { BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); String line = null; StringBuilder sb = new StringBuilder(); //一直讀取 while (!mIsServiceDestory) { line = bReader.readLine(); //無流資料則斷開連結 if (line == null){ break; } sb.append(line); Log.d(TAG, "connectServerWithTCPSocket: " + sb.toString()); pWriter.println("你好客戶端,這是來自服務端的問候!"); } //不要關閉服務端serverSocket bReader.close(); pWriter.close(); socket.close(); } }

客戶端實現:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TAG = "MainActivity";
    private static final int PORT = 5000;
    private Socket mSocket = null;
    private PrintWriter pWriter;
    private BufferedReader bReader;
    private Button mSendBtn;
    public static final int MSG_DATA = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSendBtn = findViewById(R.id.id_btn);
        mSendBtn.setOnClickListener(this);
        Intent intent = new Intent(MainActivity.this, SorviceSocket.class);
        startService(intent);
        new Thread(new MyRunnable()).start();
    }

    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case MSG_DATA:
                    String strMsg = msg.getData().toString();
                    Toast.makeText(MainActivity.this, strMsg, Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.id_btn:
                if (pWriter !=null){
                    pWriter.println("你好伺服器");
                }
                // 傳送讀取的資料到服務端
                break;

            default:
                break;
        }
    }

    private class MyRunnable implements Runnable {
        @Override
        public void run() {
            connectServerWithTCPSocket();
        }
    }

    protected void connectServerWithTCPSocket() {
        while (mSocket == null) {
            try {
                // 建立一個Socket物件,並指定服務端的IP及埠號
                mSocket = new Socket("locketHost", PORT);
                pWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())));
                bReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                String line = null;
                StringBuilder sb = new StringBuilder();
                while (!MainActivity.this.isFinishing()) {
                    line = bReader.readLine();
                    if (line == null) {
                        break;
                    }
                    sb.append(line);
                    mHandler.obtainMessage(MSG_DATA,sb.toString());
                    Log.d(TAG, "connectServerWithTCPSocket: " + sb.toString());
                }
                bReader.close();
                pWriter.close();
                mSocket.close();
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}