0

我们有我的公司喜欢在一夜之间运行的批处理文件,所以我使用了我们的服务器(MatLab)/客户端(Java/Eclispe)代码,该代码可以很好地处理单个文件,在所有内容上放置一个真正的循环并让它以这种方式正常工作. 我们遇到的唯一问题是服务器总是通过 socket.accept() 调用寻找客户端,但如果它没有客户端连接到它,它就会永远坐在那里。要关闭程序,我们必须转到任务管理器并强制关闭它。

因此,我可以通过任何方式将计时器置于接受状态,因此如果在一定时间后没有人尝试连接,不再运行批处理文件,我可以取消连接并关闭程序。

4

1 回答 1

0

此代码将允许您在 accept() 上设置超时

private ServerSocket listener;  
    private int timeout;  
    private Thread runner;  
    private boolean canceled;  

    ...  

    // returns true if cancel signal has been received  
    public synchronized boolean isCanceled()  
    {  
        return canceled;  
    }  

    // returns true if this call does the canceling  
    // or false if it has already been canceled  
    public synchronized boolean cancel()  
    {  
        if ( canceled ) {  
            // already canceled due to previous caller  
            return false;  
        }  

        canceled = true;  
        runner.interrupt();  
        return true;  
    }  

    public void run()  
    {  
        // to avoid race condition (see below)  
        listener.setSoTimeout(timeout);  

        while ( ! isCanceled() ) {  
            // DANGER!!  
            try {  
                Socket client = listener.accept();  
                // hand client off to worker thread...  
            }  
            catch ( SocketTimeoutException e ) {  
                // ignore and keep looping  
            }  
            catch ( InterruptedIOException e ) {  
                // got signal while waiting for connection request  
                break;  
            }  
        }  

        try {  
            listener.close();  
        }  
        catch ( IOException e ) {  
            // ignore; we're done anyway  
        }  
    }  
于 2012-06-26T16:50:14.550 回答