2012-02-24 54 views
0

我正在使用Java編寫的Apache Thrift服務器。當我創建ServerSocket時,我傳遞了一個名爲clientTimeout的值爲60000(十分鐘)的參數。但是這不能按預期工作 - 我連接到服務器,執行方法等待11分鐘執行方法再次沒有重新連接,並沒有得到錯誤(如我所料)。 我試着做不在SSL節儉服務器上,這工作正常。 在節儉的來源我發現如何SSL插座創建,似乎沒問題。Java SSLServerSocket soTimeout無法正常工作?

private static TServerSocket createServer(SSLServerSocketFactory factory, int port, int timeout, boolean clientAuth, 
            InetAddress ifAddress, TSSLTransportParameters params) throws TTransportException { 
    try { 
     SSLServerSocket serverSocket = (SSLServerSocket) factory.createServerSocket(port, 100, ifAddress); 
     serverSocket.setSoTimeout(timeout); 
     serverSocket.setNeedClientAuth(clientAuth); 
     if (params != null && params.cipherSuites != null) { 
     serverSocket.setEnabledCipherSuites(params.cipherSuites); 
     } 
     return new TServerSocket(serverSocket); 
    } catch (Exception e) { 
     throw new TTransportException("Could not bind to port " + port, e); 
    } 
    } 

有沒有人有這樣的問題?如何解決它?

回答

2

ServerSocket上的超時僅影響ServerSocket.accept().它不會被接受的Sockets作爲讀取超時繼承。如果你想要的話,你必須明確地設置它。這是Java API和BSD套接字API之間的區別。

+0

請問我是否正確理解你......問題不在於讀取客戶端超時。問題是關於客戶端閒置十分鐘後服務器未關閉打開的連接。我認爲服務器根本不關閉它們。但是你說setSoTimeout只是關於.accept(),我需要在可接受的socet中查找其他超時? – 2012-02-24 12:14:58

+0

@AlexeySviridov我說'ServerSocket.setSoTimeout()'是一個accept()超時。 Socket.setSoTimeout()是一個讀取超時。如果您想要在已接受的套接字上讀取超時,那麼您需要調用該API,並且需要在接受的套接字上調用它。 – EJP 2012-02-27 08:50:29

+0

其實這是一個在節儉服務器代碼中的錯誤,但是你給了正確的方向。我修復了節儉服務器代碼並在節儉jira中創建了一個bug - https://issues.apache.org/jira/browse/THRIFT-1523。在那裏,我解釋了這個錯誤,因爲我可以用我醜陋的英語:)請編造你的答案(如果你能理解我寫的是什麼,從節儉錯誤中添加信息),我將其標記爲正確。 – 2012-02-28 02:58:15