一个有服务器建立长连接的demo

该博客展示了如何在Android中实现TCP长连接,包括初始化连接、发送和接收消息的线程处理,以及错误处理。`TcpLongSocket`类用于创建与服务器的连接,并通过`ReadThread`接收消息,通过`ExecutorService`线程池发送消息。同时,`OrderManagerService`服务用于管理和操作TCP连接,包括注册监听器来接收服务器响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class TcpLongSocket {
    public static final String TAG = "TcpLongSocket";
    public static String HOST = "172";
    public static int PORT = 44023;

    private ReadThread mReadThread;//接收消息线程
    private InitSocketThread mInitSocketThread;//初始化线程,用来连接服务器
    private Socket mSocket;
    private Handler sgameHandler;
    private boolean isReceiveMessage = false;//用来决定是否接收数据
    private ExecutorService cachedThreadPool;//线程池,用来发送消息

    public TcpLongSocket() {

    }

    public void initTcpLongSocket(String host, int port, Handler sgameHandler) {
        LogUtil.e(TAG, "initTcpLongSocket");
        HOST = host;
        PORT = port;
        isReceiveMessage = true;
        cachedThreadPool = Executors.newCachedThreadPool();
        this.sgameHandler = sgameHandler;
        mInitSocketThread = new InitSocketThread();
        mInitSocketThread.start();
    }

    class InitSocketThread extends Thread {
        @Override
        public void run() {
            super.run();
            try {
                mSocket = new Socket(HOST, PORT);
                LogUtil.e(TAG, "开始连接服务器");
                mReadThread = new ReadThread();
                mReadThread.start();
                while (connectJudge) {
                    if (isSocketConnect()) {
                        connectJudge = false;
                        if (onConnectListener != null) {
                            onConnectListener.onConnect(true);
                        }
                    }
                }
            } catch (UnknownHostException e) {
                e.printStackTrace();
                LogUtil.e(TAG + "----------------", e.toString());
            } catch (IOException e) {
                e.printStackTrace();
                LogUtil.e(TAG + "----------------", e.toString());
            }
        }
    }

    public boolean sendMsg(final byte[] req) {
        if (null == mSocket) {
            return false;
        }
        cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    if (!mSocket.isClosed() && !mSocket.isOutputShutdown()) {
                        LogUtil.e(TAG, "--------------发送的信息------------------" + new String(req));
                        OutputStream os = mSocket.getOutputStream();
                        os.write(req);
                        os.flush();
                        LogUtil.e(TAG, "--------------发送的信息-------发送成功-----------");
                        LogUtil.e(TAG, "--------------发送的信息-------发送成功-------req.length----" + req.length);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    LogUtil.e(TAG, "--------------发送的信息------------ e.printStackTrace();------");
                }
            }
        });
        return true;
    }

    /**
     * 接收消息
     */
    class ReadThread extends Thread {

        public void release() {
            releaseLastSocket();
        }

        @Override
        public void run() {
            super.run();
            if (null != mSocket) {
                try {
                    InputStream is = mSocket.getInputStream();
                    byte[] buffer = new byte[1024 * 4];
                    int length = 0;
                    while (!mSocket.isClosed() && !mSocket.isInputShutdown()
                            && isReceiveMessage && ((length = is.read(buffer)) != -1)) {
                        if (length > 4) {
                            String line = new String(Arrays.copyOf(buffer,
                                    length)).trim();
                            Log.e(TAG, "接收的消息:" + line);
                            //收到服务器过来的消息,就通过Broadcast发送出去
                            transpond(buffer, length);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                if (onConnectListener != null) {
                    onConnectListener.onConnect(false);
                }
            }
        }
    }

    private boolean connectJudge = true;

    public interface OnConnectListener {
        void onConnect(boolean isConnect);
    }

    OnConnectListener onConnectListener;

    public void setOnConnectListener(OnConnectListener onConnectListener) {
        this.onConnectListener = onConnectListener;
    }


    private void transpond(byte[] buffer, int length) {
        byte[] bytes = Arrays.copyOf(buffer, length);
        Log.e(TAG, "transpond   接收的消息  bytes:" + new String(bytes));
        Message message = sgameHandler.obtainMessage();
        message.obj = bytes;
        sgameHandler.sendMessage(message);
    }

    /**
     * 关闭socket
     */
    private void releaseLastSocket() {
        try {
            connectJudge = true;
            if (null != mSocket) {
                if (!mSocket.isClosed()) {
                    mSocket.close();
                }
                mSocket = null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭所有的东西,包括socket、线程等
     */
    public void colseSocketTcp() {
        LogUtil.e(TAG, "关闭tcp");
        releaseLastSocket();
        if (mInitSocketThread != null) {
            mInitSocketThread.interrupt();
        }
        if (mReadThread != null) {
            mReadThread.interrupt();
        }
        isReceiveMessage = false;
    }

    /**
     * socket是否已经链接
     *
     * @return
     */
    public boolean isSocketConnect() {
        if (mSocket != null) {
            return mSocket.isConnected();
        }
        return false;
    }

    /**
     * 重新链接
     *
     * @param host
     * @param port
     */
    public void resetSocketConnect(String host, int port, Handler sgameHandler) {
        colseSocketTcp();
        HOST = host;
        PORT = port;
        this.sgameHandler = sgameHandler;
        isReceiveMessage = true;
        cachedThreadPool = Executors.newCachedThreadPool();
        mInitSocketThread = new InitSocketThread();
        mInitSocketThread.start();
    }


}具体使用
public class OrderManagerService extends Service {
    public static final String TAG = "OrderManagerService";
    public static String orderManagerServiceHost;
    public static int orderManagerServicePort;
    private TcpLongSocket tcpLongSocket;
    private AtomicBoolean atomicBoolean = new AtomicBoolean(false);
    private RemoteCallbackList<IOnReceiveBytesListener> iOnReceiveBytesListenerRemoteCallbackList = new RemoteCallbackList<>();
    private MyHandler myHandler = new MyHandler();

    @Override
    public void onCreate() {
        super.onCreate();
        LogUtil.i(TAG, "onCreate");
        if (!TextUtils.isEmpty(orderManagerServiceHost) && orderManagerServicePort != 0) {
            tcpLongSocket = new TcpLongSocket();
            tcpLongSocket.initTcpLongSocket(orderManagerServiceHost, orderManagerServicePort, myHandler);
        }
    }

    private Binder binder = new IOrderManager.Stub() {
        @Override
        public void initTcp(String host, int port) throws RemoteException {
            LogUtil.i(TAG, "initTcp    host:" + host);
            LogUtil.i(TAG, "initTcp    port:" + port);
            connectService(host, port);
        }

        @Override
        public void sendByte(byte[] bytes) throws RemoteException {

        }

        @Override
        public void sendGoodsInfo(GoodsDetail netbarCharge, List<GoodsDetail> goodsDetailList, int payType) throws RemoteException {
            LogUtil.i(TAG, "sendGoodsInfo   netbarCharge:" + netbarCharge.toString());
            LogUtil.i(TAG, "sendGoodsInfo   goodsDetailList:" + goodsDetailList.toString());
            LogUtil.i(TAG, "sendGoodsInfo   payType:" + payType);
            if (tcpLongSocket != null) {
                boolean sendSuccess = tcpLongSocket.sendMsg(OrderUtils.crearGoodsByte(netbarCharge, goodsDetailList, payType));
                LogUtil.i(TAG, "---------sendGoodsInfo-------noticeStatus");
                if (!sendSuccess) {
                    noticeStatus(sendSuccess);
                }
            }
        }

        @Override
        public void registerOnReceiveBytesListener(IOnReceiveBytesListener listener) throws RemoteException {
            boolean register = iOnReceiveBytesListenerRemoteCallbackList.register(listener);
            LogUtil.i(TAG, "registerOnReceiveBytesListener:" + register);
        }

        @Override
        public void unRegisterOnReceiveBytesListener(IOnReceiveBytesListener listener) throws RemoteException {
            boolean unRegister = iOnReceiveBytesListenerRemoteCallbackList.unregister(listener);
            LogUtil.i(TAG, "unRegisterOnReceiveBytesListener:" + unRegister);
        }
    };

    /**
     * 链接服务器
     *
     * @param host
     * @param port
     */
    private void connectService(String host, int port) {
        if (tcpLongSocket == null) {
            tcpLongSocket = new TcpLongSocket();
            tcpLongSocket.initTcpLongSocket(String.valueOf(host), port, myHandler);
            orderManagerServiceHost = host;
            orderManagerServicePort = port;
        } else {
            if (tcpLongSocket.isSocketConnect()) {
                if (!host.equals(orderManagerServiceHost)) {
                    tcpLongSocket.resetSocketConnect(host, port, myHandler);
                } else if (port != orderManagerServicePort) {
                    tcpLongSocket.resetSocketConnect(host, port, myHandler);
                } else {
                    LogUtil.i(TAG, "---------connectService-------noticeStatus");
                    noticeStatus(true);
                }
            } else {
                tcpLongSocket.resetSocketConnect(host, port, myHandler);
            }
        }
        socketIsConnectingListener();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        LogUtil.i(TAG, "binder:" + binder);
        return binder;
    }

    class MyHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            byte[] bytes = (byte[]) msg.obj;
            ReceiveData receiveData = new ReceiveData();
            int sIndex = OrderUtils.getSIndex(bytes);
            receiveData.setsIndex(sIndex);
            LogUtil.i(TAG, "bytes.length:" + bytes.length);
            LogUtil.i(TAG, " new String(bytes):" + new String(bytes));
            LogUtil.i(TAG, "sIndex:" + sIndex);
            LogUtil.i(TAG, "handleMessage   new String(bytes):" + new String(bytes));
            if (sIndex == OrderUtils.DEFINE_ID_PACK_ORDER_RECY) {
                int sPackLen = OrderUtils.getSPackLen(bytes, 4);
                LogUtil.i(TAG, "DEFINE_ID_PACK_ORDER_RECY   sPackLen:" + sPackLen);
                //订单回包数据
                String orderRecy = OrderUtils.getReceiveData(bytes, sPackLen, 8);
                receiveData.setsPackLen(sPackLen);
                receiveData.setsPackData(orderRecy);
            } else if (sIndex == OrderUtils.DEFINE_ID_PACK_ORDER_PAY_RECY) {
                int sCode = OrderUtils.getSPackLen(bytes, 4);
                LogUtil.i(TAG, "DEFINE_ID_PACK_ORDER_PAY_RECY    sCode:" + sCode);
                int sPackLen = OrderUtils.getSPackLen(bytes, 8);
                LogUtil.i(TAG, "DEFINE_ID_PACK_ORDER_PAY_RECY     sPackLen:" + sPackLen);
                //支付回包
                String payRecy = OrderUtils.getReceiveData(bytes, sPackLen, 12);
                receiveData.setsCode(sCode);
                receiveData.setsPackLen(sPackLen);
                receiveData.setsPackData(payRecy);
            }
            try {
                final int n = iOnReceiveBytesListenerRemoteCallbackList.beginBroadcast();
                for (int i = 0; i < n; i++) {
                    IOnReceiveBytesListener iOnDataTransmissionListenerRemoteCallbackList = iOnReceiveBytesListenerRemoteCallbackList.getBroadcastItem(i);
                    if (iOnDataTransmissionListenerRemoteCallbackList != null) {
                        LogUtil.i(TAG, "onReceiveBytes:success");
                        iOnDataTransmissionListenerRemoteCallbackList.onReceiveBytes(receiveData);
                    } else {
                        LogUtil.i(TAG, "onReceiveBytes:fail");
                    }
                }
                iOnReceiveBytesListenerRemoteCallbackList.finishBroadcast();
            } catch (RemoteException e) {
                LogUtil.i(TAG, "onReceiveBytes:RemoteException");
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        LogUtil.i(TAG, "onDestroy");
        atomicBoolean.set(true);
        if (tcpLongSocket == null) {
            tcpLongSocket.colseSocketTcp();
        }
    }

    private void noticeStatus(boolean isSuccessConnect) {
        LogUtil.i(TAG, "---------noticeStatus-------isSuccessConnect:" + isSuccessConnect);
        try {
            final int n = iOnReceiveBytesListenerRemoteCallbackList.beginBroadcast();
            for (int i = 0; i < n; i++) {
                IOnReceiveBytesListener iOnDataTransmissionListenerRemoteCallbackList = iOnReceiveBytesListenerRemoteCallbackList.getBroadcastItem(i);
                if (iOnDataTransmissionListenerRemoteCallbackList != null) {
                    if (isSuccessConnect) {
                        LogUtil.i(TAG, "---------noticeStatus-------onSuccessConnect");
                        iOnDataTransmissionListenerRemoteCallbackList.onSuccessConnect();
                    } else {
                        LogUtil.i(TAG, "---------noticeStatus-------onFailConnect");
                        iOnDataTransmissionListenerRemoteCallbackList.onFailConnect(0);
                    }
                }
            }
            iOnReceiveBytesListenerRemoteCallbackList.finishBroadcast();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private void socketIsConnectingListener() {
        if (tcpLongSocket != null) {
            LogUtil.i(TAG, "socketIsConnectingListener");
            tcpLongSocket.setOnConnectListener(new TcpLongSocket.OnConnectListener() {
                @Override
                public void onConnect(boolean isConnect) {
                    LogUtil.i(TAG, "---------tcpLongSocket.setOnConnectListener-------noticeStatus");
                    noticeStatus(isConnect);
                }
            });
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值