【简单封装】Android——TCP客户端

封装类

public class PZHelp_TCPClient extends Thread {
    
    
    private static final String TAG = "PZHelp_TCPClient";

    private Socket socket;
    private String address;
    private int    port;

    private boolean isTCPClientOpen = false;

    private InputStream is = null;
    private PrintWriter pw = null;

    private ReceiveListener listener;

    PZHelp_TCPClient(String address, int port, ReceiveListener listener) {
    
    
        this.address = address;
        this.port = port;
        this.listener = listener;
    }

    @Override
    public synchronized void start() {
    
    
        isTCPClientOpen = true;
        super.start();
    }

    /**
     * 开启通讯
     */
    @Override
    public void run() {
    
    
        while (isTCPClientOpen) {
    
    
            try {
    
    
                socket = new Socket(address, port);
                if (socket.isConnected()) {
    
    
                    is = socket.getInputStream();
                    pw = new PrintWriter(socket.getOutputStream(), true);
                    listener.onSuccess();
                    //开始接收信息
                    receive();
                } else {
    
    
                    listener.onFail("连接失败");
                }
            } catch (ConnectException ce) {
    
    
                listener.onFail("无法连接服务器");
            } catch (IOException e) {
    
    
                listener.onFail("连接异常");
                e.printStackTrace();
            }
            try {
    
    
                sleep(3000);
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    ///**
    // * 接收信息
    // */
    //private void receive() {
    
    
    //    int length;
    //    byte[] buff = new byte[2048];
    //
    //    while (isTCPClientOpen && !socket.isClosed() && !socket.isInputShutdown()) {
    
    
    //        try {
    
    
    //            if ((length = is.read(buff)) != -1) {
    
    
    //                //连接正常
    //                String receive = new String(buff, 0, length, "GBk");
    //                listener.Receive(receive);
    //            } else {
    
    
    //                //连接断开
    //                listener.onFail("服务器通讯关闭!");
    //                break;
    //            }
    //        } catch (IOException e) {
    
    
    //            listener.onFail("接收异常");
    //            e.printStackTrace();
    //        }
    //    }
    //}

    /**
     * 接收信息 数据量较大时需要带缓冲区(自己使用的协议,直接复制使用会出错)
     */
    private void receive() {
    
    
        int length;
        byte[] read = new byte[4096];
        byte[] buff = new byte[40960];
        int buffLength = 0;
        int dataLength = 0;
        boolean islenfull = true;
        while (isTCPClientOpen && !socket.isClosed() && !socket.isInputShutdown()) {
    
    
            try {
    
    
                if ((length = is.read(read)) != -1) {
    
    
                    //连接正常
                    Log.d(TAG, "length: " + length);
                    if (islenfull) {
    
    //需要处理新的len包
                        String string = new String(read, 0, length, "GBk");
                        int ls = string.indexOf("<len>");
                        if (ls != -1) {
    
    
                            int le = string.substring(ls).indexOf("</len>");
                            if (ls == 0 && le != -1) {
    
    //是len包
                                dataLength = Integer.parseInt(string.substring(ls + 5, le));
                                if (length >= dataLength) {
    
    //len包数据已经齐全
                                    listener.Receive(string);
                                } else {
    
    //len包未齐全
                                    islenfull = false;
                                    System.arraycopy(read, 0, buff, 0, length);
                                    buffLength = length;
                                }
                            }
                        }
                    } else {
    
    //上一个len包未处理完成
                        System.arraycopy(read, 0, buff, buffLength, length);
                        buffLength += length;
                        if (buffLength >= dataLength) {
    
    
                            listener.Receive(new String(buff, 0, buffLength, "GBK"));
                            islenfull = true;
                        }
                    }
                } else {
    
    
                    //连接断开
                    listener.onFail("服务器通讯关闭!");
                    break;
                }
            } catch (IOException e) {
    
    
                listener.onFail("接收异常");
                e.printStackTrace();
                break;
            }
        }
    }

    /**
     * 发送信息
     *
     * @param msg 信息
     * @return 是否发送成功
     */
    public boolean send(String msg) {
    
    
        try {
    
    
            if (!socket.isClosed()) {
    
    
                pw.println(msg);
                pw.flush();
                return true;
            }
            return false;
        } catch (Exception e) {
    
    
            return false;
        }
    }

    /**
     * 关闭通讯
     */
    public void close() {
    
    
        isTCPClientOpen = false;
        try {
    
    
            socket.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }

    /**
     * 回调
     */
    public interface ReceiveListener {
    
    
        void onSuccess();

        void onFail(String err);

        void Receive(String response);
    }
}

使用

PZHelp_TCPClient mTCPClient = new PZHelp_TCPClient("192.168.0.228", 8888, mListener);
mTCPClient.start();
... ...
PZHelp_TCPClient.ReceiveListener mListener = new PZHelp_TCPClient.ReceiveListener() {
    
    
    @Override
    public void onSuccess() {
    
    
        //连接成功
    }

    @Override
    public void onFail(String err) {
    
    
        //错误
        Log.e(TAG, "onFail: " + err);
    }

    @Override
    public void Receive(String response) {
    
    
        //成功接收到数据
        Log.d(TAG, "Receive: "+response);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_36881363/article/details/102564225