點對點網際網路應用程式介紹
主從式 (Client-Server)架構:
由伺服器採被動模式,等待用戶端連線。由用戶端連至伺服器。應用:網站、 FTP等。由伺服器提供客戶端服務。在伺服器中含有 Listen socket 。
點對點 (Peer-to-Peer)架構:
可由任何一端連線至另一端。兩端是同一個程式。應用:檔案分享 ( ezPeer 、 Kuro )、ICQ、NetMeeting。每一個Peer都有Listen socket。
我們可以將每個Peer想像成把伺服器和用戶端包在 一起。 一般來說,點對點連線必須知道另一端的IP位置。最簡單的方法是利用一個伺服器,存放每個Peer的IP位置。需要時另一端IP位置時,向伺服器查詢即可。
程式流程提示
Step 1 : 初始化擷取影像和聲音所需的資源.
Step 2: 準備擷取影像與聲音.
- Step2.1 : 取得handle.
- Step2.2: 連結硬體.
- Step2.3: 取得並設定資料結構.
Step 3 : 初始化及設定壓縮程式.
Step 4 : 擷取影像與聲音.
Step 5 : 將資料即時以壓縮程式壓縮.
Step 6: 傳送與接收資料
- Step6.1 : 建立連線.
- Step6.2: server端送出資料, client即時接收資料.
Step 7 : 將接收到的資料解壓縮並即時播放.
每一步驟列舉其中一個將需要用到的function為範例,變數名稱僅供參考,其餘所需要的function,大多可於 vfw.h 中找到。
if( !( hdd = DrawDibOpen ()))
{
Application-> MessageBox ( " initDisplay DrawDipOpen Error!","Error",MB_OK );
}
if( !( hdc = GetDC ( hParent )))
{
Application-> MessageBox ( " initDisplay GetDC Error!","Error",MB_OK );
}
if( !( hWndCap = capCreateCaptureWindow ( "Capture Window", WS_CHILD,
0, 0 ,CAPWIDTH,CAPHEIGHT , hParent , 7)))
{
Application-> MessageBox ( " capCreateCaptureWindow ERROR", " Error",MB_OK );
}
compressor.Init ( Form1->Handle);
if( ! capCaptureSequenceNoFile ( hWndCap ))
{
Application-> MessageBox ( " capCaptureSequenceNoFile ERROR","Error",MB_OK );
}
lpcompresseddata = compressor.compress ( lpVHdr -> lpData );
void __ fastcall TForm1::Button5Click( TObject *Sender)
{
ClientSocket ->Port= RemotePortEdit -> Text.ToInt ( );
ClientSocket ->Address= RemoteIPEdit ->Text;
ClientSocket -> Open( );
}
lpdecompresseddata = compressor.decompress ( lpcompresseddata );
if( ! DrawDibBegin (video.hdd,video.hdc,-1,-1,&video.bmpinfo.bmiHeader,CAPWIDTH,CAPHEIGHT,NULL))
{
Application-> MessageBox ( " initDisplay DrawDibBegin Error!","Error",MB_OK );
}
if(! DrawDibDraw (video.hdd,video.hdc,0,0,320,200,&video.bmpinfo.bmiHeader,lpdecompresseddata
,0,0,CAPWIDTH,CAPHEIGHT,DDF _SAME_DRAW | DDF_SAME_HDC))
{
Application-> MessageBox ( " DrawDibDraw ERROR","Error",MB_OK );
}