Android Socket通信--TcpClient

這只是一張圖片

本文原創(chuàng),歡迎隨便匿名轉(zhuǎn)載,你高興就行。


背景:小的是做android開(kāi)發(fā)的,項(xiàng)目中經(jīng)常要和硬件打交道,所以會(huì)遇到好多做android開(kāi)發(fā)不經(jīng)常遇到的問(wèn)題。這次項(xiàng)目中要和硬件之間用TCP通信,我是客戶端,使用dataInputStream.readUTF()方法收不到硬件發(fā)過(guò)來(lái)的數(shù)據(jù),但是和我自己寫的服務(wù)端通信都正常。F&&&K?。?!
google半天發(fā)現(xiàn)這句話 “readUTF()只能讀取writeUTF方法寫入的數(shù)據(jù)”,所以我只能直接使用輸入輸出流操作,DataInputStream和DataOutputStream都是Java中輸入輸出流的裝飾類,用起來(lái)很方便,但其也有局限性。

自己封裝了一個(gè)TcpClientConnector,有用的上的直接用就行。


TcpClientConnector

package com.hadisi.socket;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * Created by hadisi on 2016/6/28.
 */

public class TcpClientConnector {
    private static TcpClientConnector mTcpClientConnector;
    private Socket mClient;
    private ConnectLinstener mListener;
    private Thread mConnectThread;

    public interface ConnectLinstener {
        void onReceiveData(String data);
    }

    public void setOnConnectLinstener(ConnectLinstener linstener) {
        this.mListener = linstener;
    }

    public static TcpClientConnector getInstance() {
        if (mTcpClientConnector == null)
            mTcpClientConnector = new TcpClientConnector();
        return mTcpClientConnector;
    }

    Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 100:
                    if (mListener != null) {
                        mListener.onReceiveData(msg.getData().getString("data"));
                    }
                    break;
            }
        }
    };

    public void creatConnect(final String mSerIP, final int mSerPort) {
        if (mConnectThread == null) {
            mConnectThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        connect(mSerIP, mSerPort);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            mConnectThread.start();
        }
    }

    /**
     * 與服務(wù)端進(jìn)行連接
     *
     * @throws IOException
     */
    private void connect(String mSerIP, int mSerPort) throws IOException {
        if (mClient == null) {
            mClient = new Socket(mSerIP, mSerPort);
        }
        InputStream inputStream = mClient.getInputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = inputStream.read(buffer)) != -1) {
            String data = new String(buffer, 0, len);
            Message message = new Message();
            message.what = 100;
            Bundle bundle = new Bundle();
            bundle.putString("data", data);
            message.setData(bundle);
            mHandler.sendMessage(message);
        }
    }

    /**
     * 發(fā)送數(shù)據(jù)
     *
     * @param data 需要發(fā)送的內(nèi)容
     */
    public void send(String data) throws IOException {
        OutputStream outputStream = mClient.getOutputStream();
        outputStream.write(data.getBytes());
    }

    /**
     * 斷開(kāi)連接
     *
     * @throws IOException
     */
    public void disconnect() throws IOException {
        if (mClient != null) {
            mClient.close();
            mClient = null;
        }
    }
}

代碼很簡(jiǎn)單,用了單例,封裝了發(fā)送數(shù)據(jù)send(String data)方法和斷開(kāi)連接disconnect()方法,還有一接收數(shù)據(jù)的接口OnConnectLinstener。

怎么用它?

  • 獲取TcpClientConnector單例對(duì)象
connector = TcpClientConnector.getInstance();
  • 創(chuàng)建tcp連接creatConnect("服務(wù)端IP地址","服務(wù)端端口號(hào)");
connector.creatConnect("服務(wù)端IP地址","服務(wù)端端口號(hào)");
  • 實(shí)現(xiàn)接收數(shù)據(jù)接口OnConnectLinstener,onReceiveData(String data)中的data就是服務(wù)端返回的數(shù)據(jù);
connector.setOnConnectLinstener(new TcpClientConnector.ConnectLinstener() {
    @Override
    public void onReceiveData(String data) {
        //do somethings.
    }
});
  • 在你想要斷開(kāi)連接的地方調(diào)用disconnect()方法,一般在onDestroy()方法中調(diào)用。
@Override
protected void onDestroy() {
    super.onDestroy();
    try {
        connector.disconnect();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容