Android Socket简单封装

本文介绍了在Android中如何简单封装Socket通信,用于与C#程序交互。提供了初始化连接、创建连接、设置监听、发送数据及关闭连接的步骤,实现便捷的Socket操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();//关闭连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值