從Indy9升級到Indy10時IdTcpServer的變化

從Indy9升級到Indy10時IdTcpServer的變化
一、從Indy9升級到Indy10時IdTcpServer的變化        
試用了CodeGear2007後感覺挺好的,於是決定升級。別的都很順利,就是程序中用到的控件Indy9.18要升級到Indy10.15,IdTcpServer變化的比較大。       
首先Indy9.18中的TcpServer在Indy10中被分割成了2個組件:TIdCmdTCPServer和TIdTCPServer。其中TIdCmdTCPServer是原來的TIdTCPServer,新的TIdTCPServer單獨分出來了。如下圖所示:        再者所以的原始的reads 和writes包括Read, ReadLn, Write, WriteLn等現在變成IOHandler的屬性而不是TCPConnection的。按照官方的文檔,這樣做的原因一方面是爲了將原始的I/O操作隔 離開來,另一方面是爲了便於實現多態。變化如下圖所示:        
第三就是控件中各事件的標識由“AThread: TIdPeerThread” 變成了“AContext: TIdContext”。在9種一個事件是在線程中執行的,每個連接都有單獨的線程。而在10中則不同,同一個連接在不同的時候可能使用不同的線程。就是 把連接和線程分離了,這樣能在連接過多的時候減少佔用的資源和避免由線程切換帶來的開銷。連接信息的的存儲位置也就不同,在9中存在AThread.Data裏,在10中存在TIdContext.Data裏。       
第四是 9中線程管理ThreadMgr變成了10中的調度管理Scheduler。這樣既能像原來那樣進行線程管理,也能對SuperCore中的調度纖程管理。       
上面就是在官方文檔中描述的變化,還有SSL的變化,因爲本例中沒用到,就不說了。下面從代碼上說說具體的變化。          
用CodeGear打開delphi的代碼,會提示下列錯誤:         
“Error reading IdTcpServer1.CommandHandlers”       
“Error reading IdTcpServer1.Greeting.NumericCode”       
“Error reading IdTcpServer1.MaxConnectionReply.NumericCode”        “Error reading IdTcpServer1.ReplyExceptionCode"       
 “Error reading IdTcpServer1.ReplyTexts”       
"Error reading IdTcpServer1.ReplyUnknownCommand.NumericCode”       
“Error reading IdTcpServer1.ThreadMgr”         
"Class TIdThreadMgrPool not found"        
全部忽略,然後升級下列代碼:       
1、將IdThreadMgrPool替換爲IdSchedulerOfThreadPool1組件,並將IdTcpServer1的Scheduler屬性改成IdSchedulerOfThreadPool1。       
2、將AThread : TIdPeerThread相關的全部代碼改成AContext: TIdContext,並將Connection.下的相關I/O方法替換成Connection.IOHandler.的方法。       
3、也是比較麻煩的,程序中需要定位每一個連接,在Indy9中是用AThread.ThreadID定位每一個連接的。因爲9種連接和線程是一一對應 的,可以用線程ID定位連接。但在indy10種AContext:和線程不再對應,所以改爲採用客戶端發來的硬件序列號來確定,將序列號信息存在 AContext:.data中。因爲程序中有許多部分都與此有關,所以修改起來挺麻煩的。
二、indy9 與 indy10的區別 作者:佚名 來源:轉載 發佈時間:2008-03-24 19:46:59

1.ReadBuffer

indy9: Athread.Connection.ReadBuffer()

indy10: tmpBytes : TIdBytes;

Athread.Connection.IOHandler.ReadBytes(tmpBytes, currRead); Buffer := PWord(@tmpBytes[0])^;

2.Synchronize

indy9: Athread.Synchronize();

改成indy10: uses idsync; //... procedure TfmMain.TCPServerExecute(AContext: TIdContext); begin Tidsync.SynchronizeMethod(IncrConnectioncount); //... end; procedure TfmMain.IncrConnectionCount; begin inc(FConnectionCount); end;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章