今天回到家已經22點了,雖然有點晚,但是今天還是必須堅持,因爲我知道大多數計劃都是因爲某些特殊情況耽誤,就一直放棄了,所以我必須堅持下去,不能找任何理由。
繼續研究TCP服務器的內容,Tcp服務器主要跟Server, TcpServer和TcpServerThread這幾個類有關係,Tcp服務器的序列圖如下所示:
其中Server是管理所有服務器的服務器,接收用戶對各種服務器的開啓,關閉等操作。TcpServer是H2數據庫的Tcp服務器。TcpServerThread是TcpServer在
處理多個連接請求開啓的線程。其中TcpServer在處理連接請求時候,又會創建一個org.h2.value.Transfer類的對象。
我覺得org.h2.value.Transfer的設計有些問題。在調用它進行處理的時候,需要進行很多步驟,這樣的對外接口不是太簡潔,不利用其它類調用使用它的方法。
transfer = new Transfer(null);
transfer.setSocket(socket);
transfer.init();
使用它的方法需要這麼多步驟,如果不熟悉API的程序員在使用它的時候就很容易出錯,我覺得這個類設計的不是太合理。
Transfer類的構造函數完全可以這麼寫:
public Transfer(SessionInterface session, Socket socket) {
this.session = session;
init();
}
這樣調用的時候直接transfer = new Transfer(socket);,然後就可以直接調用transfer的其它方法。
經過閱讀可知道Transfer類中的方法均是對DataInputStream,DataOutputStream兩個輸入輸出流中的方法進行一些必要的封裝,並且添加了一些新的方法。
如writeValue和ReadValue是直接讀寫Value對象的方法。
然後開始讀取客戶端的連接信息,如數據庫版本,數據庫名稱,用戶名,密碼等等信息。
再調用Engine engine = Engine.getInstance();得到Engine對象,Engine使用了單例模式,而且是線程安全的。