Websocket:是不是可以从程序中知道调用 onClose 的原因是啥

Posted

技术标签:

【中文标题】Websocket:是不是可以从程序中知道调用 onClose 的原因是啥【英文标题】:Websocket : Is it possible to know from the program what is the reason for onClose being calledWebsocket:是否可以从程序中知道调用 onClose 的原因是什么 【发布时间】:2013-04-15 03:34:21 【问题描述】:

我有一个示例 WebSocket 程序,它可以正常工作

当用户关闭浏览器或有任何异常或任何断开连接时,onClose 方法是 被叫

我的问题是,是否有可能从程序中知道调用 onClose 的原因是什么? 请分享您的观点,感谢阅读。

public class html5Servlet extends WebSocketServlet 

    private AtomicInteger index = new AtomicInteger();

    private static final List<String> tickers = new ArrayList<String>();
    static
        tickers.add("ajeesh");
        tickers.add("peeyu");
        tickers.add("kidillan");
        tickers.add("entammo");
    

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public WebSocket doWebSocketConnect(HttpServletRequest req, String resp) 
        //System.out.println("doWebSocketConnect");
        return new StockTickerSocket();
    
    protected String getMyJsonTicker() throws Exception
        return "";
    
    public class StockTickerSocket implements WebSocket.OnTextMessage
        private Connection connection;
        private Timer timer; 


        @Override
        public void onClose(int arg0, String arg1) 
            System.out.println("onClose called!"+arg0);
        

        @Override
        public void onOpen(Connection connection) 
            //System.out.println("onOpen");
            this.connection=connection;
            this.timer=new Timer();
        

        @Override
        public void onMessage(String data) 
            //System.out.println("onMessage");
            if(data.indexOf("disconnect")>=0)
                connection.close();
                timer.cancel();
            else
                sendMessage();

                       
        




        public void disconnect() 

            System.out.println("disconnect called");
        

        public  void onDisconnect()
        
            System.out.println("onDisconnect called");
        


        private void sendMessage() 

            if(connection==null||!connection.isOpen())
                //System.out.println("Connection is closed!!");
                return;
            
            timer.schedule(new TimerTask() 

                    @Override
                    public void run() 
                        try
                            //System.out.println("Running task");
                            connection.sendMessage(getMyJsonTicker());
                        
                        catch (IOException e) 
                            e.printStackTrace();
                         catch (Exception e) 
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        
                    
                , new Date(),5000);
        

    

【问题讨论】:

【参考方案1】:

onClose 的签名如下...

    @Override
    public void onClose(int closeCode, String closeReason) 
        System.out.println("onClose called - statusCode = " + closeCode);
        System.out.println("                 reason     = " + closeReason);
    

其中int closeCode 是registered Close Status Codes 中的任何一个。

String closeReason 是可选的 (per protocol spec) 关闭原因消息。

【讨论】:

以上是关于Websocket:是不是可以从程序中知道调用 onClose 的原因是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何知道应用程序是不是从 android 通知托盘打开?

如何使用 websocket 检查消息是不是真的在 Netty 中传递?

Android - WebSocket - 从最近使用的应用程序清除应用程序时,连接从服务中删除

NodeJS中的Websockets。从服务器端WebSocket客户端调用WebSocketServer

如何从 nodejs 服务器订阅 ws websocket 到另一台服务器?

客户端-服务器 websocket 通信