how to react to the “keep-alive” package in androi

2019-06-01 08:59发布

问题:

My android app connects the server with TCP socket, to make sure the connection is ok, the server sends the "keep-alive" msg every 10s when idle, I can grab the packet in WireShark, but in my app, I can't handle the packet anywhere, seems that the packet can't be read with the socket.

Below is the code segment of my socket connection. Seems that the "keep-alive" packet just can't be read with the inputstream...

public class SocketBase {
    private Socket mSocket;
    private DataOutputStream out;
    private DataInputStream in;
    private SocketCallback callback;
    private int timeOut = 1000 * 30;


    public SocketBase(SocketCallback callback) {
        this.callback = callback;
    }


    public void connect(String ip, int port) throws Exception {
        mSocket = new Socket();
        SocketAddress address = new InetSocketAddress(ip, port);
        mSocket.connect(address, timeOut);
        if (mSocket.isConnected()) {
            out = new DataOutputStream(mSocket.getOutputStream());
            in = new DataInputStream(mSocket.getInputStream());
            callback.connected();
        }
    }


    public void write(byte[] buffer) throws IOException {
        if (out != null) {
            out.write(buffer);
            out.flush();
        }
    }


    public void disconnect() {
        try {
            if (mSocket != null) {
                if (!mSocket.isInputShutdown()) {
                    mSocket.shutdownInput();
                }
                if (!mSocket.isOutputShutdown()) {
                    mSocket.shutdownOutput();
                } 
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
                mSocket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            callback.disconnect();
            out = null;
            in = null;
            mSocket = null;
        }
    }


    public void read() throws IOException {
        if (in != null) {
            byte[] buffer = new byte[1024*1];
            byte[] tmpBuffer;
            int len = 0;
            Log.i("SOCKET", "something comming");
            while ((len = in.read(buffer)) > 0) {
                tmpBuffer = new byte[len];
                System.arraycopy(buffer, 0, tmpBuffer, 0, len);
                callback.receive(tmpBuffer);
                tmpBuffer = null;
            }
        }
    }
}

The "keep-alive" packet in WireShark is like this:

回答1:

If you mean a regular TCP keep-alive, there's nothing for you to detect or do. Your TCP implementation takes care of acknowledging it. There's no application data in it, so there's nothing for you to read.