Android Socket简单封装

来源:互联网 发布:java 毫秒转日期 编辑:程序博客网 时间:2024/05/22 03:46

Android Socket简单封装

公司资源库中会与 C# 程序通讯,和同事商讨了之后决定用使用 Socket 通讯方式,则此处简单的封装了一个相关库

/** * Socket连接简单封装 * Created by TAO_SX on 2016/9/18/018. */public class SocketClient {    private static SocketClient socketClient;    private Socket mClient;    private ConnectListener mListener;    private Thread mConnectThread;    private String mSerIP = null;    private int mSerPort = 0;    public void setOnConnectListener(ConnectListener linstener) {        this.mListener = linstener;    }    public static SocketClient getInstance() {        if (socketClient == null)            socketClient = new SocketClient();        return socketClient;    }    Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case 100://socket线程接收到数据交给Handler处理                    if (mListener != null) {                        mListener.onReceiveData(msg.getData().getString("data"));                    }                    break;            }        }    };    /**     * 创建连接     *     * @param mSerIP     * @param mSerPort     */    public void creatConnect(final String mSerIP, final int mSerPort) {        this.mSerIP = mSerIP;        this.mSerPort = mSerPort;        if (mConnectThread == null) {            mConnectThread = new Thread(new Runnable() {                @Override                public void run() {                    connect(mSerIP, mSerPort);                }            });            mConnectThread.start();        }    }    /**     * 与服务端进行连接     */    private void connect(String mSerIP, int mSerPort) {        int connect_count = 0;        while (mClient == null) {//检测是否实例化,如果没有实例化则进行实例化            connect_count++;            if (mListener != null) {                mListener.onConnectionLoading(connect_count);            }            try {                mClient = new Socket(mSerIP, mSerPort);                if (mListener != null) {                    mListener.onConnectionSucceeded();//连接成功,回调通知                }            } catch (IOException e) {                if (connect_count == 3) {//连接3次                    if (mListener != null) {                        mListener.onConnectError();                    }                    return;                }                SystemClock.sleep(3000);            }        }        try {            //接收数据            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);            }        } catch (IOException e) {        }    }    /**     * 发送数据     *     * @param data     */    public void send(final String data) {        new Thread(new Runnable() {            @Override            public void run() {                try {                    OutputStream outputStream = mClient.getOutputStream();                    outputStream.write(data.getBytes());                } catch (IOException e) {                    if (mListener != null) {                        mListener.onBrokenPipe();                    }                    //释放连接资源                    mClient = null;                    mConnectThread = null;                    if (mSerIP != null                            && mSerPort != 0) {                        creatConnect(mSerIP, mSerPort);//重新连接                    }                }            }        }).start();    }    /**     * 断开连接     *     * @throws IOException     */    public void disconnect() {        if (mClient != null) {            try {                mClient.shutdownInput();                mClient.shutdownOutput();                mClient.close();                mClient = null;                mConnectThread = null;                mListener.onDisconnect();            } catch (IOException e) {                Log.d("断开连接", e.getMessage());            }        }    }    /**     * 对外暴露监听回调     */    public interface ConnectListener {        /**         * 连接成功         */        void onConnectionSucceeded();        /**         * 连接等待         *         * @param i 值为连接次数         */        void onConnectionLoading(int i);        /**         * 接收数据         *         * @param data 值为接收到的数据         */        void onReceiveData(String data);        /**         * 连接错误,目前用于未连接到网络、连接超时...         */        void onConnectError();        /**         * 连接中断(连接断开后无法发送数据)         */        void onBrokenPipe();        /**         * 断开         */        void onDisconnect();    }}

代码部分相对于比较简单,使用也比较方便,使用方法如下:

SocketClient socketClient = SocketClient.getInstance();//初始化连接
socketClient.creatConnect(ip, port);//创建连接
socketClient.setOnConnectListener(linstener);//创建监听
socketClient.send(s);//发送数据
socketClient.disconnect();//关闭连接

0 0
原创粉丝点击