java版简易socket客户端

android项目需要使用到心跳, 于是编写了一个简易的socket客户端程序

主要功能是给服务端发送心跳包,保持在线状态

 

没有使用框架,这样避免了需要引入包,直接使用的阻塞Socket通信。

 

主要逻辑如下

public class TCPConnector implements Connector {
    private final byte[] PACK_LENGTH = new byte[4];

    private String host;
    private int port;
    private Socket client;
    private TCPConnectNotify connectNotify;
    private boolean needWork;

    public TCPConnector(String host, int port, TCPConnectNotify connectNotify){
        this.host = host;
        this.port = port;
        this.connectNotify = connectNotify;
        this.needWork = true;
    }

    //@Override
    public void connect() {
        try {
            client = new Socket(host, port);
            client.setKeepAlive(true);
        } catch (IOException e) {
            e.printStackTrace();
            closeConnect();
            connectNotify.connectFailed();
            return;
        }

        if (!client.isConnected()) {
            connectNotify.connectFailed();
            return;
        }
        connectNotify.connectSuccess();

        work();
    }

    //@Override
    public void send(Object object) {
        if (needWork) {
            try {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                ObjectOutputStream oout = new CompactObjectOutputStream(byteArrayOutputStream);
                oout.writeObject(object);
                oout.flush();
                oout.close();

                int size = byteArrayOutputStream.size();
                byte[] array = ByteBuffer.allocate(4).putInt(size).array();

                ByteArrayOutputStream pack = new ByteArrayOutputStream();
                pack.write(array);
                pack.write(byteArrayOutputStream.toByteArray());

                OutputStream outputStream = client.getOutputStream();
                outputStream.write(pack.toByteArray());

            } catch (IOException e) {
                e.printStackTrace();
                closeConnect();
            }
        }
    }

    //@Override
    public void close() {
        //needWork = false;
        closeConnect();
    }

    private void work() {
        while (needWork) {
            //printStatue();
            checkConnect();
            checkReceiveMsg();
            sleepMills(10000);
        }
    }

    void checkConnect() {
        if (client == null
                || !client.isConnected()
                || client.isInputShutdown()
                || client.isOutputShutdown()) {
            connect();
        }
    }

    void checkReceiveMsg() {
        try {
            DataInputStream dataInputStream = getDataStream();
            int num = dataInputStream.available();
            if (num > 0)
                System.out.println("服务端返回长度:" + num);
            if (num > 4) {

                dataInputStream.read(PACK_LENGTH);

                String s = Hex2StringHelper.hexString(PACK_LENGTH);
                System.out.println(s);

                ObjectInputStream objectInputStream = new CompactObjectInputStream(
                        dataInputStream, new ClassLoaderClassResolver(this.getClass().getClassLoader()));
                Object object = objectInputStream.readObject();
                connectNotify.newMessageSuccess(object);
            }
        } catch (Exception e) {
            e.printStackTrace();
            connectNotify.newMessageFailed();
            closeConnect();
        }
    }

    void sleepMills(int mills) {
        try {
            TimeUnit.MILLISECONDS.sleep(mills);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    DataInputStream getDataStream() {
        DataInputStream dataInputStream = null;
        try {
            dataInputStream = new DataInputStream(client.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
            closeConnect();
        } finally {
            return dataInputStream;
        }
    }

    void closeConnect() {
        if (client != null) {
            try {
                client.shutdownOutput();
                client.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            } finally {
                client = null;
            }
        }
    }
}

 

具体代码simple-socket-demo

 

posted @ 2016-12-14 15:41  漫漫的蜗牛  阅读(334)  评论(0编辑  收藏  举报