開始設(shè)計(jì)一個(gè)對(duì)稱的通訊框架了。這個(gè)框架要求所有client的電腦上有一組host threads。host threads可以在另一個(gè)程序里面。有了host之后,client就可以跟遠(yuǎn)程或者本機(jī)的程序通訊了。client可以做的事情有:與host連接與斷開,指定一個(gè)遠(yuǎn)程的client并發(fā)送信息,通知host可以不必繼續(xù)維護(hù)到某client的連接,查詢某個(gè)ip和端口下面的所有client。每一次通訊的時(shí)候,client都必須給出ip\port\name來,而不是獲取一個(gè)連接然后使用。鑒于client和host未必在同一個(gè)程序上,獲得連接然后使用不是很好。
因此就有了如下的設(shè)計(jì)。host通過socket與其他地方的host通訊,client與host通過named pipe聯(lián)系。client與client的信息通過兩個(gè)或更多的host傳遞。到了這里,就有必要指定一下協(xié)議了。
首先是client-host。client-host發(fā)的消息的格式是:Type:BYTE , NameLen:BYTE , Name:CHAR[ ] , MsgLen:INT , Msg:CHAR[ ]。這5部分串在一起成為一個(gè)完整的消息通過named pipe傳遞。Type定義如下:
client發(fā)給host:
0:CONNECT_TO_HOST , Name=ignore , Message=client name
1:DISCONNECT_TO_HOST , Name=ignore , Message=ignore
2:COMMUNICATE , Name="ip\port\client name" , Message=?
3:REQUEST_LIST , Name="ip\port\*" , Message=ignore
4:COMMUNICATE_FINISH , Name="ip\port\client name" , Message=ignore
host發(fā)給client:
0:ERROR , Name=ignore , Message=?
1:DISCONNECT_TO_CLIENT , Name=ignore , Message=ignore
2:COMMUNICATE , Name="ip\port\client name" , Message=?
3:RECEIVE_LIST , Name="ip\host\*" , Message="name1\name2\...."
其次是host與host之間的消息。消息的格式是Type:BYTE , SourceLen:BYTE , SourceName:CHAR[ ] , DestLen:BYTE , DestName:CHAR[ ] , MsgLen:INT , Msg=CHAR[ ]。跟client-host一樣,也是串在一起成為一個(gè)完整的消息的。Type定義如下:
消息:(HELLO在不同的狀態(tài)下有不同的意義)
0:ERROR , Source=ignore , Dest=ignore , Message=?
1:HELLO , Source=ignore , Dest=ignore , Message=?
2:HELLO_RESPONSE , Source=ignore , Dest=ignore , Message=HELLO的消息內(nèi)容反轉(zhuǎn)
3:DISCONNECT , Source=ignore , Dest=ignore , Message=ignore
4:COMMUNICATE , Source="client name" , Dest="client name" , Message=?
5:REQUEST_LIST , Source=ignore , Dest=ignore , Message=ignore
6:RECEIVE_LIST , Source=ignore , Dest=ignore , Message="name1\name2\...."
因?yàn)閏lient每一次發(fā)消息都要填上地址,因此host可以自行決定要不要將某些socket斷開。同理,COMMUNICATE_FINISH也是可以不發(fā)的,這只是為了資源管理的靈活性而設(shè)置的。這個(gè)東西就暫時(shí)命名為Vczh Messenger吧。Vczh Messenger將提供兩套類庫。第一套用于建立host,第二套用于建立client。這樣的話,一個(gè)程序可以決定跟其他程序共享host或者是自己給自己建立host。client將使用事件驅(qū)動(dòng)模型。配合vl::system::synchronize命名空間下的一些組件可以很容易將事件驅(qū)動(dòng)模型修改為其他各種各樣的模型。
Vczh Messenger在邏輯上是無連接無順序的通訊框架,用于為進(jìn)一步的remote object access服務(wù)。