在局域網內實現(xiàn)圖像的實時傳輸_第1頁
在局域網內實現(xiàn)圖像的實時傳輸_第2頁
在局域網內實現(xiàn)圖像的實時傳輸_第3頁
在局域網內實現(xiàn)圖像的實時傳輸_第4頁
在局域網內實現(xiàn)圖像的實時傳輸_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上在局域網內實現(xiàn)圖像的實時傳輸在局域網內實現(xiàn)圖像的實時傳輸(實現(xiàn)環(huán)境bcb6.0+MSSQL) 本來要去睡覺的,但是為了整理一下該文檔,還是坐在了電腦旁。明天睡個大頭覺。 之所以使用bcb6.0,是因為用它開發(fā)速度快。但是一個前輩曾經給我說過,bcb開發(fā)的軟件沒有商業(yè)價值,當然他說的有點偏頗,不過也反映了bcb的境遇。不過如果開發(fā)較小的項目,使用它的優(yōu)勢還是明顯的。 轉入正題,在網絡傳輸信息,有兩種模型:C/S、P2P。C/S模式需要在網絡內有個服務器,客戶端傳輸信息都要通過服務器進行轉發(fā)。當傳輸信息量較小的文本信息時,采用該方法因為其實現(xiàn)較簡單,方便控制信息的傳輸,所

2、以可以使用,以前的QQ就是采用這個方法,但是如果傳輸信息量較大的圖像信息時,顯然當客戶端較多時,服務器的負擔會呈級數(shù)增加,顯然是不合適的。只有使用P2P模式,即節(jié)點之間傳輸,這樣可以把負載平衡到各個節(jié)點,效率很高。但是它的缺點也是很明顯的,每個節(jié)點都要負責維護其他節(jié)點的狀態(tài)信息,實現(xiàn)起來比較復雜。這個也是現(xiàn)在的研究熱點,并有成品出現(xiàn),但是也是應用于較小的網絡。 在做這個網絡協(xié)作系統(tǒng)時,由于人力資源較弱,所以我采用了這種的方法。就是把這兩者結合,在圖像信息傳輸?shù)臅r候采用P2P模式,但是需要在網絡內運行一個服務器來負責維護各個節(jié)點的狀態(tài)信息。這樣可以極大的減少服務器的負荷,同時節(jié)點間傳輸?shù)膶崿F(xiàn)也比

3、較容易。 實現(xiàn)方法:服務器運行,監(jiān)視各個節(jié)點的狀態(tài)。當一個節(jié)點登陸網絡時,需要向服務器報告自己的狀態(tài),并請求得到它希望傳輸圖像信息的狀態(tài)信息。當?shù)玫叫畔r,便不再與服務器進行交互,而是自己把圖像向節(jié)點傳輸。當該節(jié)點退出網絡時要向服務器報告。可見服務器的工作就是一個索引服務器,而負載已經平衡到了各個節(jié)點。 應用背景:在網絡協(xié)作學習系統(tǒng)中實時協(xié)作學習電子白板 系統(tǒng)中的電子白板是一個虛擬公共學習區(qū)域,在問題求解的過程中它作為主要的問題解決方案編輯的協(xié)作空間,而不同于聊天室只承擔組內成員溝通和情感維系的工作,以及與教師就學習問題互動的渠道。 實時協(xié)作學習電子白板的功能 基本的書寫的功能,可以對文字進行

4、協(xié)作編輯 對文字可以進行重點標示,以及擦除。 對協(xié)作動作進行控制,即在操作前必須首先控制申請,操作結束后解除控制。 可以對文字和標記進行點對點的傳輸,亦可在組內廣播。 代碼實現(xiàn):節(jié)點與服務器的交互采用C/S模式,使用控件ClientSocket/ServerSocket,節(jié)點間傳輸信息,由于需要實現(xiàn)接收和發(fā)送兩個功能,所以在每個節(jié)點都要有兩個控件,一個用來接收,一個用來發(fā)送,該系統(tǒng)中使用了NMStrm/NMStrmServ控件。數(shù)據(jù)庫采用MSSQL,當然要存放在服務器上。有必要強調的是,要把圖像的BMP格式轉化為JPG格式在進行傳輸,這樣可以大大縮小傳輸?shù)男畔⒘俊?該方法的 缺點:在傳輸圖像時

5、,采用的是傳輸整個圖像方法。雖然經過格式優(yōu)化,但是還是有很大的信息量,較好的方法是傳輸在白板上的動作信息,比如畫線動作,可以采集關鍵部位的坐標和畫筆顏色信息傳輸,這樣更能減少信息量的傳輸(仲日給提的建議),但是實現(xiàn)起來較麻煩,考慮到時間問題,沒有實現(xiàn)。 部分源代碼:(部分代碼參考csdn的bcb版和 節(jié)點端 /-#include <vcl.h>#pragma hdrstop#include "board.h"#include "Unit7.h"#include "Unit1.h"#include <jpeg.hpp&

6、gt;/-#pragma package(smart_init)#pragma resource "*.dfm"TWhiteBoard *WhiteBoard;/-_fastcall TWhiteBoard:TWhiteBoard(TComponent* Owner) : TForm(Owner)/-void _fastcall TWhiteBoard:FormCreate(TObject *Sender) /禁用關閉按鈕 EnableMenuItem(GetSystemMenu(Handle,false), SC_CLOSE, MF_DISABLED | MF_BYCOM

7、MAND | MF_GRAYED); Button3->Enabled = false; Timer1->Enabled = false; m_npenFlag = 0;/初始化畫筆的功能 Image->Parent->DoubleBuffered = true; void *dsdc; void *dxwnd; dxwnd=GetDesktopWindow();/取得桌面句柄 dsdc=GetDC(dxwnd); BitBlt(Image->Canvas->Handle,0,0,NULL,NULL,dsdc,0,0,SRCCOPY); ReleaseDC(

8、dxwnd,dsdc);/-void _fastcall TWhiteBoard:ImageMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) /m_oldCursor = Screen->Cursor; if (m_npenFlag = 1)/輸入文本 if (Shift.Contains(ssCtrl)/按下ctrl,要改變文本大小 int xstart,ystart; Screen->Cursor = crSizeNWSE; xstart = myMemo->Left; ystart = myMemo-

9、>Top; myMemo->Width = X - xstart; myMemo->Height = Y - ystart; else Screen->Cursor = crCross; if (m_npenFlag = 2)/畫筆 if(Shift.Contains(ssLeft) if(x1=-1&&y1=-1) x1=X; y1=Y; /Image->Canvas->Pen->Color=clRed; Image->Canvas->Pen->Width=3; Image->Canvas->MoveTo

10、(x1,y1); Image->Canvas->LineTo(X,Y); else /Image->Canvas->Pen->Color=clRed; Image->Canvas->Pen->Width=3; Image->Canvas->MoveTo(x1,y1); Image->Canvas->LineTo(X,Y); x1=X; y1=Y; if (m_npenFlag = 3)/橡皮 if(Shift.Contains(ssLeft) if(x1=-1&&y1=-1) x1=X; y1=Y; /Im

11、age->Canvas->Pen->Color=clRed; Image->Canvas->MoveTo(x1,y1); Image->Canvas->LineTo(X,Y); else /Image->Canvas->Pen->Color=clRed; Image->Canvas->MoveTo(x1,y1); Image->Canvas->LineTo(X,Y); x1=X; y1=Y; /-void _fastcall TWhiteBoard:ImageMouseUp(TObject *Sender, T

12、MouseButton Button, TShiftState Shift, int X, int Y) if(Button=mbLeft) x1=-1; y1=-1; /-void _fastcall TWhiteBoard:BitBtn2Click(TObject *Sender) m_npenFlag = 2; if (ColorDialog->Execute() Image->Canvas->Pen->Color = ColorDialog->Color;/-/產生輸入文本框void _fastcall TWhiteBoard:ImageMouseDown

13、(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) if (m_npenFlag = 1) if (Button=mbLeft ) if (myMemo != NULL) delete myMemo; myMemo = NULL; myMemo = new TMemo(Owner); myMemo->Parent = Panel1; myMemo->Left = X; myMemo->Top = Y; myMemo->Width = 500; myMemo->Height

14、= 20; myMemo->Ctl3D = false; myMemo->OnMouseMove = Memo1MouseMove; else if (m_npenFlag = 2) x1 = X; y1 = Y; if (m_npenFlag = 3) Image->Canvas->Pen->Color = clCaptionText; Image->Canvas->Pen->Width = 13; Image->Canvas->Rectangle(X-1, Y-1, X, Y); /-void _fastcall TWhiteBo

15、ard:BitBtn1Click(TObject *Sender) m_npenFlag = 1;/-void _fastcall TWhiteBoard:Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) if (m_npenFlag = 1) if(X<0|X>Panel1->Width|Y<0|Y>Panel1->Height) ReleaseCapture(); Screen->Cursor = crArrow; / Label1->Caption="

16、;Leave"/鼠標離開事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crCross; / Label1->Caption="Enter"/鼠標進入事件 if (m_npenFlag = 2) if(X<0|X>Panel1->Width|Y<0|Y>Panel1->Height) ReleaseCapture(); Screen->Cursor = crArrow; / La

17、bel1->Caption="Leave"/鼠標離開事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crHandPoint; / Label1->Caption="Enter"/鼠標進入事件 Label1->Caption = IntToStr(X)+","+IntToStr(Y);/-void _fastcall TWhiteBoard:Memo1MouseMove(TObje

18、ct *Sender, TShiftState Shift, int X, int Y) /if (Shift.Contains(ssCtrl) / Label1->Caption = IntToStr(X)+","+IntToStr(Y); Screen->Cursor = crIBeam;/-void _fastcall TWhiteBoard:FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) Screen->Cursor = crArrow;/-void _fastcall

19、 TWhiteBoard:BitBtn3Click(TObject *Sender) Image->Canvas->TextOutA(myMemo->Left,myMemo->Top,myMemo->Text); if (myMemo != NULL) delete myMemo; myMemo = NULL; /-void _fastcall TWhiteBoard:BitBtn4Click(TObject *Sender) Screen->Cursor = crNoDrop; m_npenFlag = 3;/-void _fastcall TWhiteB

20、oard:NMStrmServ1MSG(TComponent *Sender, const AnsiString sFrom, TStream *strm) TMemoryStream *ImageStream; ImageStream = new TMemoryStream; strm->Seek(0,soFromBeginning); TJPEGImage *jpeg; / 定義JPEG圖象 try jpeg = new TJPEGImage; / 分配內存 / 從數(shù)據(jù)流中載入圖象 jpeg->LoadFromStream(strm); / 顯示圖象 Image->Pic

21、ture->Bitmap->Assign(jpeg); /MessageBeep(MB_OK); / 發(fā)出提示聲音 _finally delete jpeg; / 釋放資源 delete ImageStream; ImageStream = NULL;/-void _fastcall TWhiteBoard:Button2Click(TObject *Sender) WorkRoom->ClientSocket->Socket->SendText("4:"+NBCL->m_sUserID+":Request");/申請

22、白板控制權 Button2->Enabled = false; Button3->Enabled = true;/-/定時傳輸圖像,以達到實時傳輸目的void _fastcall TWhiteBoard:Timer1Timer(TObject *Sender) TMemoryStream *imgstream; imgstream = new TMemoryStream; Graphics:TBitmap *bBitmap; / 定義位圖變量 try bBitmap = new Graphics:TBitmap(); / 創(chuàng)建位圖 / 拷貝屏幕的指定區(qū)域到位圖 bBitmap-&g

23、t;Assign(Image->Picture->Bitmap); TJPEGImage *jpeg; try jpeg = new TJPEGImage; / 創(chuàng)建JPEG圖象 jpeg->Assign(bBitmap); / 將位圖轉化為JPEG格式 jpeg->SaveToStream(imgstream); / 保存JPEG圖象信息 _finally delete jpeg; / 釋放資源 _finally delete bBitmap; / 釋放資源 /向服務器發(fā)送圖像信息 /* AnsiString shostName = WorkRoom->Clie

24、ntSocket->Socket->RemoteHost; try imgstream->Position = 0; NMStrm1->Host=shostName; /指定主機名 NMStrm1->PostIt(imgstream); /發(fā)送的文件 catch(.) */ /找到其他組成員 vFindOtherHost(); for (int i=0; i<m_nHostNum; i+) try imgstream->Position = 0; NMStrm1->Host=m_sOtherHosti; /指定主機名 NMStrm1->Po

25、stIt(imgstream); /發(fā)送的文件 catch(.) delete imgstream; imgstream = NULL;/-void _fastcall TWhiteBoard:Button3Click(TObject *Sender) WorkRoom->ClientSocket->Socket->SendText("4:"+NBCL->m_sUserID+":Giveup");/放棄白板控制權 Button2->Enabled = true; Button3->Enabled = false; Ti

26、mer1->Enabled = false; WorkRoom->Memo->Lines->Add("我放棄了白板控制權");/-void _fastcall TWhiteBoard:FormHide(TObject *Sender) Timer1->Enabled = false; if (Button3->Enabled) WorkRoom->ClientSocket->Socket->SendText("4:"+NBCL->m_sUserID+":Giveup");/放

27、棄白板控制權 if (WorkRoom->Showing) WorkRoom->Hide();/-/得到其他節(jié)點狀態(tài)void TWhiteBoard:vFindOtherHost() /TODO: Add your source code here /找到同組在線人的計算機名稱 /讀取本組在線成員信息表 AnsiString SQL; AnsiString sUserID,sUserName; AnsiString sHost,sIP; SQL = " declare teamid int " SQL += " select teamid=TeamID

28、 from StudentGroupInfo where UserID='"+NBCL->m_sUserID+"'" SQL += " select R.UserID,UserName,O.Host,O.IP from StudentRegisterInfo as R inner join StudentGroupInfo as G on R.UserID=G.UserID and G.TeamID=teamid inner join OnlineInfo as O on O.UserID=G.UserID" NBCL->MainQuery->Close(); NBCL->MainQuery->SQL->Clear(); NBCL->MainQuery->SQL->Add(SQL); NBCL->MainQuery->Open(); m_nHostNum = 0; while (!NBCL-&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論