2008-11-04 37 views
2

我有一個Java服務器接受使用JSSE的SSL連接,並在流內使用簡單的XML消息格式。我希望服務器讀取完整的消息,然後發送回覆。事實證明,這很困難,因爲org.xml.sax.XMLReader想要讀取整個流,然後調用close()。我知道這看起來很奇怪,但是在Java 6中,Sun JSSE提供程序確實關閉了SSLSocket的兩端,因此沒有消息可以返回。我嘗試在客戶端使用Socket的shutdownOutput()方法,但這不受JSSE支持。JSSE連接上的XML流結束了嗎?

我的解決方案是傳遞一個封裝在自定義類中的InputStream,該類默默地忽略關閉請求,並指示該流在遇到第一個空行時被關閉。這限制了XML超出通常有效的範圍,但客戶端可以根據需要輕鬆地過濾輸入中的空行。有更好的解決方案嗎?

回答

1

您的客戶如何知道何時讀完了完整的信息?如果它必須讀取直到輸入流達到其結尾,那麼按照定義,無論如何你都不能從流中讀取任何東西。另一方面,在輸入流上調用close()不應該關閉套接字。當您在輸入流上調用close()時,確定該插座已關閉嗎?當它注意到它的輸出流(你的輸入流)已被關閉時,連接可能被(不正確)關閉。

避免直到輸入流結束纔讀取的解決方案是以某種方式分隔輸入消息。例如,您可以在消息之前發送消息的長度,然後將整個消息從流中讀取到緩衝區中,然後使用XMLReader解析緩衝區,或者創建一個特殊的InputStream,該特定的InputStream在達到指定的數據。或者你可以在消息之後的流中添加一個特殊的分隔符,那麼當底層流產生分隔符時,你會創建一個特殊的InputStream達到它的結尾。

1

由於每個xml文檔只有一個根節點。因此,掃描此節點的結尾並關閉流。

相關問題