代码之家  ›  专栏  ›  技术社区  ›  Sagar Jethva

android socket.io中的发出或确认超时处理?

  •  2
  • Sagar Jethva  · 技术社区  · 7 年前

    使用时 socket.io 如果套接字在应答前断开连接(或根本不应答),则发出带有回调的消息,回调函数将永远挂起。在其他情况下,如果网络连接不足,则发出套接字,但如果发出成功,则不进行回调。

    在这些情况下,我想在发出回调中实现超时,但是ack消息没有超时。

    这是我的插座发射代码 ACK

        JSONObject obj = new JSONObject();
        try {
    
            obj.put("device_id", deviceVO.getDeviceId());
            obj.put("device_status", deviceVO.getOldStatus());
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    
       mSocket.emit("socketChangeDevice", obj, new Ack() {
                @Override
                public void call(Object... args) {
                    if(args!=null){
                        Ack ack = (Ack) args[args.length - 1];
                        ack.call();
                        Log.d("ACK_SOCKET","isAck : "+ ack);
                    }
                }
            });
    

    有没有更好的方法在客户端断开连接时返回失败的回调?我需要手动执行超时?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Sagar Jethva    7 年前

    套接字发出超时确认

    我的 AckWithTimeOut 带有实现的自定义超时类 Ack 接口

    public class AckWithTimeOut implements Ack {
    
    private Timer timer;
    private long timeOut = 0;
    private boolean called = false;
    
    public AckWithTimeOut() {
    }
    
    public AckWithTimeOut(long timeout_after) {
        if (timeout_after <= 0)
            return;
        this.timeOut = timeout_after;
        startTimer();
    }
    
    public void startTimer() {
        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                callback("No Ack");
            }
        }, timeOut);
    }
    
    public void resetTimer() {
        if (timer != null) {
            timer.cancel();
            startTimer();
        }
    }
    
    public void cancelTimer() {
        if (timer != null)
            timer.cancel();
    }
    
    void callback(Object... args) {
        if (called) return;
        called = true;
        cancelTimer();
        call(args);
    }
    
    @Override
    public void call(Object... args) {
    
    }
    }
    

    添加 确认超时 在套接字中发出侦听器

     mSocket.emit("socketChangeDeviceAck", obj, new AckWithTimeOut(5000) {
                @Override
                public void call(Object... args) {
                    if(args!=null){
                        if(args[0].toString().equalsIgnoreCase("No Ack")){
                            Log.d("ACK_SOCKET","AckWithTimeOut : "+ args[0].toString());
                        }else if(args[0].toString().equalsIgnoreCase("true")){
                           cancelTimer(); //cancel timer if emit ACK return true
                           Log.d("ACK_SOCKET","AckWithTimeOut : "+ args[0].toString());
                        }
                    }
                }
            });