停止套接字听取接受

时间:2012-06-26 16:44:14

标签: sockets serversocket

我们有我的公司喜欢在一夜之间运行的批处理文件,因此我使用了我们的服务器(MatLab)/客户端(Java / Eclispe)代码,这对单个文件运行良好,对所有内容进行了一段时间的真正循环并使其工作这样就好了。我们唯一的问题是服务器总是通过socket.accept()调用来查找客户端,但如果没有客户端连接到它,它就会永远存在。要关闭程序,我们必须转到任务管理器并强制关闭它。

所以有任何方法我可以把一个计时器接受,所以如果没有人在一段时间后尝试连接,没有更多的批处理文件可以运行,我可以取消连接并关闭程序。

1 个答案:

答案 0 :(得分: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  
        }  
    }