版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上在局域網(wǎng)內(nèi)實(shí)現(xiàn)圖像的實(shí)時(shí)傳輸在局域網(wǎng)內(nèi)實(shí)現(xiàn)圖像的實(shí)時(shí)傳輸(實(shí)現(xiàn)環(huán)境bcb6.0+MSSQL) 本來(lái)要去睡覺(jué)的,但是為了整理一下該文檔,還是坐在了電腦旁。明天睡個(gè)大頭覺(jué)。 之所以使用bcb6.0,是因?yàn)橛盟_(kāi)發(fā)速度快。但是一個(gè)前輩曾經(jīng)給我說(shuō)過(guò),bcb開(kāi)發(fā)的軟件沒(méi)有商業(yè)價(jià)值,當(dāng)然他說(shuō)的有點(diǎn)偏頗,不過(guò)也反映了bcb的境遇。不過(guò)如果開(kāi)發(fā)較小的項(xiàng)目,使用它的優(yōu)勢(shì)還是明顯的。 轉(zhuǎn)入正題,在網(wǎng)絡(luò)傳輸信息,有兩種模型:C/S、P2P。C/S模式需要在網(wǎng)絡(luò)內(nèi)有個(gè)服務(wù)器,客戶(hù)端傳輸信息都要通過(guò)服務(wù)器進(jìn)行轉(zhuǎn)發(fā)。當(dāng)傳輸信息量較小的文本信息時(shí),采用該方法因?yàn)槠鋵?shí)現(xiàn)較簡(jiǎn)單,方便控制信息的傳輸,所
2、以可以使用,以前的QQ就是采用這個(gè)方法,但是如果傳輸信息量較大的圖像信息時(shí),顯然當(dāng)客戶(hù)端較多時(shí),服務(wù)器的負(fù)擔(dān)會(huì)呈級(jí)數(shù)增加,顯然是不合適的。只有使用P2P模式,即節(jié)點(diǎn)之間傳輸,這樣可以把負(fù)載平衡到各個(gè)節(jié)點(diǎn),效率很高。但是它的缺點(diǎn)也是很明顯的,每個(gè)節(jié)點(diǎn)都要負(fù)責(zé)維護(hù)其他節(jié)點(diǎn)的狀態(tài)信息,實(shí)現(xiàn)起來(lái)比較復(fù)雜。這個(gè)也是現(xiàn)在的研究熱點(diǎn),并有成品出現(xiàn),但是也是應(yīng)用于較小的網(wǎng)絡(luò)。 在做這個(gè)網(wǎng)絡(luò)協(xié)作系統(tǒng)時(shí),由于人力資源較弱,所以我采用了這種的方法。就是把這兩者結(jié)合,在圖像信息傳輸?shù)臅r(shí)候采用P2P模式,但是需要在網(wǎng)絡(luò)內(nèi)運(yùn)行一個(gè)服務(wù)器來(lái)負(fù)責(zé)維護(hù)各個(gè)節(jié)點(diǎn)的狀態(tài)信息。這樣可以極大的減少服務(wù)器的負(fù)荷,同時(shí)節(jié)點(diǎn)間傳輸?shù)膶?shí)現(xiàn)也比
3、較容易。 實(shí)現(xiàn)方法:服務(wù)器運(yùn)行,監(jiān)視各個(gè)節(jié)點(diǎn)的狀態(tài)。當(dāng)一個(gè)節(jié)點(diǎn)登陸網(wǎng)絡(luò)時(shí),需要向服務(wù)器報(bào)告自己的狀態(tài),并請(qǐng)求得到它希望傳輸圖像信息的狀態(tài)信息。當(dāng)?shù)玫叫畔r(shí),便不再與服務(wù)器進(jìn)行交互,而是自己把圖像向節(jié)點(diǎn)傳輸。當(dāng)該節(jié)點(diǎn)退出網(wǎng)絡(luò)時(shí)要向服務(wù)器報(bào)告。可見(jiàn)服務(wù)器的工作就是一個(gè)索引服務(wù)器,而負(fù)載已經(jīng)平衡到了各個(gè)節(jié)點(diǎn)。 應(yīng)用背景:在網(wǎng)絡(luò)協(xié)作學(xué)習(xí)系統(tǒng)中實(shí)時(shí)協(xié)作學(xué)習(xí)電子白板 系統(tǒng)中的電子白板是一個(gè)虛擬公共學(xué)習(xí)區(qū)域,在問(wèn)題求解的過(guò)程中它作為主要的問(wèn)題解決方案編輯的協(xié)作空間,而不同于聊天室只承擔(dān)組內(nèi)成員溝通和情感維系的工作,以及與教師就學(xué)習(xí)問(wèn)題互動(dòng)的渠道。 實(shí)時(shí)協(xié)作學(xué)習(xí)電子白板的功能 基本的書(shū)寫(xiě)的功能,可以對(duì)文字進(jìn)行
4、協(xié)作編輯 對(duì)文字可以進(jìn)行重點(diǎn)標(biāo)示,以及擦除。 對(duì)協(xié)作動(dòng)作進(jìn)行控制,即在操作前必須首先控制申請(qǐng),操作結(jié)束后解除控制。 可以對(duì)文字和標(biāo)記進(jìn)行點(diǎn)對(duì)點(diǎn)的傳輸,亦可在組內(nèi)廣播。 代碼實(shí)現(xiàn):節(jié)點(diǎn)與服務(wù)器的交互采用C/S模式,使用控件ClientSocket/ServerSocket,節(jié)點(diǎn)間傳輸信息,由于需要實(shí)現(xiàn)接收和發(fā)送兩個(gè)功能,所以在每個(gè)節(jié)點(diǎn)都要有兩個(gè)控件,一個(gè)用來(lái)接收,一個(gè)用來(lái)發(fā)送,該系統(tǒng)中使用了NMStrm/NMStrmServ控件。數(shù)據(jù)庫(kù)采用MSSQL,當(dāng)然要存放在服務(wù)器上。有必要強(qiáng)調(diào)的是,要把圖像的BMP格式轉(zhuǎn)化為JPG格式在進(jìn)行傳輸,這樣可以大大縮小傳輸?shù)男畔⒘俊?該方法的 缺點(diǎn):在傳輸圖像時(shí)
5、,采用的是傳輸整個(gè)圖像方法。雖然經(jīng)過(guò)格式優(yōu)化,但是還是有很大的信息量,較好的方法是傳輸在白板上的動(dòng)作信息,比如畫(huà)線(xiàn)動(dòng)作,可以采集關(guān)鍵部位的坐標(biāo)和畫(huà)筆顏色信息傳輸,這樣更能減少信息量的傳輸(仲日給提的建議),但是實(shí)現(xiàn)起來(lái)較麻煩,考慮到時(shí)間問(wèn)題,沒(méi)有實(shí)現(xiàn)。 部分源代碼:(部分代碼參考csdn的bcb版和 節(jié)點(diǎn)端 /-#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;/初始化畫(huà)筆的功能 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)/畫(huà)筆 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)離開(kāi)事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crCross; / Label1->Caption="Enter"/鼠標(biāo)進(jìn)入事件 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)離開(kāi)事件 else if(Panel1->Handle!=GetCapture() SetCapture(Panel1->Handle); Screen->Cursor = crHandPoint; / Label1->Caption="Enter"/鼠標(biāo)進(jìn)入事件 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");/申請(qǐng)
22、白板控制權(quán) Button2->Enabled = false; Button3->Enabled = true;/-/定時(shí)傳輸圖像,以達(dá)到實(shí)時(shí)傳輸目的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; /指定主機(jī)名 NMStrm1->PostIt(imgstream); /發(fā)送的文件 catch(.) */ /找到其他組成員 vFindOtherHost(); for (int i=0; i<m_nHostNum; i+) try imgstream->Position = 0; NMStrm1->Host=m_sOtherHosti; /指定主機(jī)名 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é)點(diǎn)狀態(tài)void TWhiteBoard:vFindOtherHost() /TODO: Add your source code here /找到同組在線(xiàn)人的計(jì)算機(jī)名稱(chēng) /讀取本組在線(xiàn)成員信息表 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球電子鎮(zhèn)痛泵行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)正照式CMOS制冷相機(jī)行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球生活用紙頭膠行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)奧美沙坦酯氫氯噻嗪片行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球帆布繪畫(huà)套件行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)防靜電HPL架空地板行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球ADAS清洗系統(tǒng)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025年全球及中國(guó)TGV激光微孔設(shè)備行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)導(dǎo)熱平臺(tái)和導(dǎo)熱板行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)13C-尿素呼氣測(cè)試試劑盒行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 醫(yī)療器械經(jīng)營(yíng)規(guī)范培訓(xùn)
- 2024拳擊比賽計(jì)劃書(shū)
- 管道直飲水系統(tǒng)技術(shù)和方案
- 婦產(chǎn)科國(guó)家臨床重點(diǎn)專(zhuān)科驗(yàn)收匯報(bào)
- 行政處罰-行政處罰種類(lèi)和設(shè)定(行政法課件)
- 柔性機(jī)械臂的振動(dòng)控制
- DB34T 4510-2023 靜脈用藥調(diào)配中心潔凈區(qū)管理規(guī)范
- 【課件】免疫系統(tǒng)組成和功能(人教版2019選擇性必修1)
- 土力學(xué)與地基基礎(chǔ)(課件)
- IT系統(tǒng)災(zāi)備和容災(zāi)解決方案項(xiàng)目設(shè)計(jì)方案
- 青島版二年級(jí)數(shù)學(xué)下冊(cè)(六三制)全冊(cè)課件【完整版】
評(píng)論
0/150
提交評(píng)論