




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上在局域網(wǎng)內(nèi)實現(xiàn)圖像的實時傳輸在局域網(wǎng)內(nèi)實現(xiàn)圖像的實時傳輸(實現(xiàn)環(huán)境bcb6.0+MSSQL) 本來要去睡覺的,但是為了整理一下該文檔,還是坐在了電腦旁。明天睡個大頭覺。 之所以使用bcb6.0,是因為用它開發(fā)速度快。但是一個前輩曾經(jīng)給我說過,bcb開發(fā)的軟件沒有商業(yè)價值,當(dāng)然他說的有點偏頗,不過也反映了bcb的境遇。不過如果開發(fā)較小的項目,使用它的優(yōu)勢還是明顯的。 轉(zhuǎn)入正題,在網(wǎng)絡(luò)傳輸信息,有兩種模型:C/S、P2P。C/S模式需要在網(wǎng)絡(luò)內(nèi)有個服務(wù)器,客戶端傳輸信息都要通過服務(wù)器進行轉(zhuǎn)發(fā)。當(dāng)傳輸信息量較小的文本信息時,采用該方法因為其實現(xiàn)較簡單,方便控制信息的傳輸,所
2、以可以使用,以前的QQ就是采用這個方法,但是如果傳輸信息量較大的圖像信息時,顯然當(dāng)客戶端較多時,服務(wù)器的負擔(dān)會呈級數(shù)增加,顯然是不合適的。只有使用P2P模式,即節(jié)點之間傳輸,這樣可以把負載平衡到各個節(jié)點,效率很高。但是它的缺點也是很明顯的,每個節(jié)點都要負責(zé)維護其他節(jié)點的狀態(tài)信息,實現(xiàn)起來比較復(fù)雜。這個也是現(xiàn)在的研究熱點,并有成品出現(xiàn),但是也是應(yīng)用于較小的網(wǎng)絡(luò)。 在做這個網(wǎng)絡(luò)協(xié)作系統(tǒng)時,由于人力資源較弱,所以我采用了這種的方法。就是把這兩者結(jié)合,在圖像信息傳輸?shù)臅r候采用P2P模式,但是需要在網(wǎng)絡(luò)內(nèi)運行一個服務(wù)器來負責(zé)維護各個節(jié)點的狀態(tài)信息。這樣可以極大的減少服務(wù)器的負荷,同時節(jié)點間傳輸?shù)膶崿F(xiàn)也比
3、較容易。 實現(xiàn)方法:服務(wù)器運行,監(jiān)視各個節(jié)點的狀態(tài)。當(dāng)一個節(jié)點登陸網(wǎng)絡(luò)時,需要向服務(wù)器報告自己的狀態(tài),并請求得到它希望傳輸圖像信息的狀態(tài)信息。當(dāng)?shù)玫叫畔r,便不再與服務(wù)器進行交互,而是自己把圖像向節(jié)點傳輸。當(dāng)該節(jié)點退出網(wǎng)絡(luò)時要向服務(wù)器報告??梢姺?wù)器的工作就是一個索引服務(wù)器,而負載已經(jīng)平衡到了各個節(jié)點。 應(yīng)用背景:在網(wǎng)絡(luò)協(xié)作學(xué)習(xí)系統(tǒng)中實時協(xié)作學(xué)習(xí)電子白板 系統(tǒng)中的電子白板是一個虛擬公共學(xué)習(xí)區(qū)域,在問題求解的過程中它作為主要的問題解決方案編輯的協(xié)作空間,而不同于聊天室只承擔(dān)組內(nèi)成員溝通和情感維系的工作,以及與教師就學(xué)習(xí)問題互動的渠道。 實時協(xié)作學(xué)習(xí)電子白板的功能 基本的書寫的功能,可以對文字進行
4、協(xié)作編輯 對文字可以進行重點標(biāo)示,以及擦除。 對協(xié)作動作進行控制,即在操作前必須首先控制申請,操作結(jié)束后解除控制。 可以對文字和標(biāo)記進行點對點的傳輸,亦可在組內(nèi)廣播。 代碼實現(xiàn):節(jié)點與服務(wù)器的交互采用C/S模式,使用控件ClientSocket/ServerSocket,節(jié)點間傳輸信息,由于需要實現(xiàn)接收和發(fā)送兩個功能,所以在每個節(jié)點都要有兩個控件,一個用來接收,一個用來發(fā)送,該系統(tǒng)中使用了NMStrm/NMStrmServ控件。數(shù)據(jù)庫采用MSSQL,當(dāng)然要存放在服務(wù)器上。有必要強調(diào)的是,要把圖像的BMP格式轉(zhuǎn)化為JPG格式在進行傳輸,這樣可以大大縮小傳輸?shù)男畔⒘俊?該方法的 缺點:在傳輸圖像時
5、,采用的是傳輸整個圖像方法。雖然經(jīng)過格式優(yōu)化,但是還是有很大的信息量,較好的方法是傳輸在白板上的動作信息,比如畫線動作,可以采集關(guān)鍵部位的坐標(biāo)和畫筆顏色信息傳輸,這樣更能減少信息量的傳輸(仲日給提的建議),但是實現(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) /禁用關(guān)閉按鈕 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;/-/產(chǎn)生輸入文本框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"/鼠標(biāo)離開事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crCross; / Label1->Caption="Enter"/鼠標(biāo)進入事件 if (m_npenFlag = 2) if(X<0|X>Panel1->Width|Y<0|Y>Panel1->Height) ReleaseCapture(); Screen->Cursor = crArrow; / La
17、bel1->Caption="Leave"/鼠標(biāo)離開事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crHandPoint; / Label1->Caption="Enter"/鼠標(biāo)進入事件 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; / 分配內(nèi)存 / 從數(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、白板控制權(quán) 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); / 將位圖轉(zhuǎn)化為JPEG格式 jpeg->SaveToStream(imgstream); / 保存JPEG圖象信息 _finally delete jpeg; / 釋放資源 _finally delete bBitmap; / 釋放資源 /向服務(wù)器發(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");/放棄白板控制權(quán) Button2->Enabled = true; Button3->Enabled = false; Ti
26、mer1->Enabled = false; WorkRoom->Memo->Lines->Add("我放棄了白板控制權(quán)");/-void _fastcall TWhiteBoard:FormHide(TObject *Sender) Timer1->Enabled = false; if (Button3->Enabled) WorkRoom->ClientSocket->Socket->SendText("4:"+NBCL->m_sUserID+":Giveup");/放
27、棄白板控制權(quán) 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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 會響的小路講課件
- 大慶職業(yè)學(xué)院《廣播電視概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 東南大學(xué)成賢學(xué)院《人力資源管理案例》2023-2024學(xué)年第二學(xué)期期末試卷
- 宜春職業(yè)技術(shù)學(xué)院《經(jīng)濟社會學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 六盤水幼兒師范高等??茖W(xué)校《中醫(yī)內(nèi)科學(xué)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東工藝美術(shù)學(xué)院《教育專業(yè)英語》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南外貿(mào)職業(yè)學(xué)院《紅樓夢研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海工會管理職業(yè)學(xué)院《社會學(xué)名著選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 職業(yè)道德考試試題及答案
- 政務(wù)禮儀考試題及答案
- 2025年福建省龍巖市中考數(shù)學(xué)模擬卷 (原卷版+解析版)
- 煤礦頂板事故預(yù)防及應(yīng)急處置知識培訓(xùn)課件
- 新疆烏魯木齊市2024-2025學(xué)年八年級上學(xué)期期末生物學(xué)試題(含答案)
- 租戶電梯使用協(xié)議書
- 土地整治項目管理
- 2025年中考歷史開卷專題速查簡表
- 某冶金機械廠全廠供電系統(tǒng)的電氣設(shè)計 (一)
- 信用卡風(fēng)險防控培訓(xùn)課件
- 模板施工方案 加油站
- 質(zhì)量管理體系變更管理制度
- 硫化氫中毒現(xiàn)場處置方案
評論
0/150
提交評論