Android中使用AsyncTask对socket连接client端的封装

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/u010838785/article/details/90293358
/**
 * 作者:guoyzh
 * 时间:2019/5/15 11:02
 * 功能:处理socket的工具类
 */
public class SocketUtils {
    private Socket socket;
    private static final SocketUtils ourInstance = new SocketUtils();

    static SocketUtils getInstance() {
        return ourInstance;
    }

    private SocketUtils() {

    }

    /**
     * 向指定ip地址发送指令
     *
     * @param ipAddress
     * @param port
     * @param msg
     * @param listener
     */
    public void sendMsg(String ipAddress, int port, String msg, OnSocketResult listener) {
        MyAsyncTask asyncTask = new MyAsyncTask(listener);
        asyncTask.execute(ipAddress, String.valueOf(port), msg);
    }

    /**
     * 自定义asyncTask
     */
    public class MyAsyncTask extends AsyncTask<String, Integer, String> {

        private final OnSocketResult listener;

        public MyAsyncTask(OnSocketResult listener) {
            super();
            this.listener = listener;
        }

        @Override
        protected String doInBackground(String... strings) {

            String address = strings[0];
            int port = Integer.parseInt(strings[1]);
            String msg = strings[2];
            String data = "";
            try {
                // Log.i("tcp", "启动客户端");
                if (socket == null) {
                    socket = new Socket(address, port);
                }
                // Log.i("tcp", "客户端连接成功");
                if (socket != null && socket.isConnected() && msg != null) {
                    socket.getOutputStream().write(msg.getBytes());
                    socket.getOutputStream().flush();

                    PrintWriter pw = new PrintWriter(socket.getOutputStream());
                    InputStream inputStream = socket.getInputStream();
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = inputStream.read(buffer)) != -1) {
                        data = new String(buffer, 0, len);
                        Log.i("tcp", "收到服务器的数据:" + data);
                        TCPClient.closeSocket(socket);
                    }
                    // Log.i("tcp", "客户端断开连接");
                    pw.close();
                }
            } catch (Exception EE) {
                EE.printStackTrace();
                // Log.i("tcp", "客户端无法连接服务器");
            } finally {
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                socket = null;
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            listener.onSuccess(result);
        }
    }

    /**
     * 获取socket结果的接口
     */
    public interface OnSocketResult {
        void onSuccess(String result);
    }
}

猜你喜欢

转载自blog.csdn.net/u010838785/article/details/90293358
今日推荐