zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    wso2使用
    wso2安装
    CLR 编译函数的两种结果的原因
    hduoj4311
    通过Git在本地局域网中的两台电脑间同步代码
    Git基本操作之强制推送覆盖仓库
    设置Mac共享网络给其他设备
    谷歌浏览器设置无图浏览模式
    加载到SGA中的库缓存对象超过阈值
    webBrowser 禁止屏蔽alert confirm open showModalDialog
  • 原文地址:https://www.cnblogs.com/AwenDF/p/6179562.html
Copyright © 2011-2022 走看看