(计算机应用技术专业论文)局域网图像广播及相关远程控制的设计与实现.pdf_第1页
(计算机应用技术专业论文)局域网图像广播及相关远程控制的设计与实现.pdf_第2页
(计算机应用技术专业论文)局域网图像广播及相关远程控制的设计与实现.pdf_第3页
(计算机应用技术专业论文)局域网图像广播及相关远程控制的设计与实现.pdf_第4页
(计算机应用技术专业论文)局域网图像广播及相关远程控制的设计与实现.pdf_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

顾士学位论文 m a s t e r st h e s i s 摘要 网络技术在教育教学中的应用日益广泛,应用于教育行业的网络软件产品也大 量出现,研究如何更好的将网络技术应用到教育行业,已成为从事计算机应用技术、 网络技术教学的广大教师及软件公司开发人员的一项重要工作。 本文讨论了如何将计算机实验室中教师在主机上操作示范时的屏幕画面传输 到学生机屏幕,并讨论了如何对学生机进行其他相关的远程控制,本文讨论的网络 软件系统也被俗称为电子教室。 为完成该网络应用开发设计,本文首先讨论了该网络应用开发的理论基础,讨 论了w i n s o c k 程序设计技术,对开发过程中的多播技术也进行了分析,为后续设计 作准备。 第三章是本文的核心部分,该部分研究了屏幕图像的压缩算法,收发双方如何 做好收发准备,如何加入多播组,如何解决大于6 4 k 数据包的广播问题,以及接收 方如何接收大于6 4 k 字节的数据包并组装显示,如何进行容错处理。 本文第四章讨论了多线程问题,在实现屏幕图像与鼠标图像传输时,为保证鼠 标图像传输有很好的实时性,系统启用了两个线程分别完成两路传输。 对如何在主机上完成对客户机的远程控制本文也进行了讨论。 本文讨论的系统已在c + + b u i l d c r 中设计实现,并取得了较好的运行效果。 关键词:网络传输;w i n s o c k ;多播;压缩;多线程 顾士学位论文 m a s t e r st h e s i s a b s t r a c t n e t w o r kt e c h n o l o g yi sb e i n ge m p l o y e di n c r e a s i n g l yf a ra n dw i d ei nt e a c h i n g t h e n e t w o r ks o f t w a r ef o re d u c a t i o n a lp u r p o s e sl a r g e l ye m e r g e s i th a sb e c o m ea ni m p o r t a n t t a s kf o rt e a c h e r sa n ds o f t w a r ec o m p a n yd e v e l o p i n gp e r s o n n e lw h ow o r ko nc o m p u t e r a p p l i c a t i o nt e c h n o l o g yo rn e t w o r kt e c h n o l o g yt e a c h i n gt os t u d yh o w t oa p p l yn e t w o r k t e c h n o l o g yt oe d u c a t i o ni nab e t t e rw a y t h i sp a p e rd i s c u s s e sh o wt ot r a n s m i tt h ep i c t u r e so nt h et e a c h e r sh o s tc o m p u t e r s c r e e nt ot h es t u d e n t s c o m p u t e r ss c r e e n sw h i l ed e m o n s t r a t i n gi nt h ec o m p u t e rl a b s i t a l s od i s c u s s e sh o wt op e r f o r mo t h e rr e l a t i v el o n g - d i s t a n c ec o n t r o lo ns t u d e n t s c o m p u t e r s t h en e t w o r ks o f t w a r es y s t e md i s c u s s e di nt h i sp a p e ri sc o m m o n l yc a l l e de - c l a s s r o o m i no r d e rt oa c c o m p l i s ht h ed e s i g no ft h i sn e t w o r ka p p l i c a t i o nd e v e l o p m e n t , t h i s p a p e rf i r s t l yd i s c u s s e st h et h e o r e t i c a lf o u n d a t i o no nt h en e ta p p l i c a t i o n t h e n i td i s c u s s e s t h ew i n s o c kp r o g r a m m i n gt e c h n i q u e sa n da n a l y s e st h em u l t i c a s t i n gt e c h n i q u e si nt h e p r o c e s so ft h ed e v e l o p m e n t ,p r e p a r i n gf o rt h es u b s e q u e n td e s i g n s t h et h i r dc h a p t e ri st h ec o r eo ft h ep a p e r i tr e s e a r c h e st h ec o m p r e s s i o na l g o r i t h mo f t h es c r e e np i c t u r e s i ta l s or e s e a r c h e st h ep r e p a r a t i o n so ft h eb o t hp a r t i e sf o rt r a n s m i s s i o n a n dr e c e i v i n g , t h em e t h o d so fj o i n i n gt h em u l t i c a s t i n gg r o u p s ,t h es o l u t i o n st ot h e b r o a d c a s t i n go ft h eb i g g e r - t h a n 6 4 kd a t ap a c k a g e s ,t h er e c e i v i n ga n da s s e m b l yd i s p l a y f o rt h er e c e i v i n gs i d et or e c e i v et h e ma n dt h ed i s p o s a lo fa l l o w i n gm i s t a k e s t h ef o u r t hc h a p t e rd i s c u s s e st h em u l t i t h r e a d i n gp r o b l e m s w h e nc a r r y i n go u tt h e t r a n s m i s s i o no ft h es c r e e np i c t u r e sa n dt h em o u s ep i c t u r e s ,i no r d e rt og u a r a n t e et h eg o o d s y n c h r o n i z a t i o no ft h em o u s ep i c t u r et r a n s m i s s i o n , t w ot h r e a d sm u s tb e s t a r t e dt o c o n d u c tt h et w o - w a yt r a n s m i s s i o ns e p a r a t e l y t h ep a p e ra l s od i s c u s s e st h el o n g - d i s t a n c ec o n t r o lo ft h ec l i e n t so v e rt h eh o s t c o m p u t e r s t h es y s t e md i s c u s s e di nt h ep a p e rh a sb e e nr e a l i z e di nt h ec + + b u i l d e rd e s i g na n d a c q u i r e sg o o dr u n n i n ge f f e c t s k e yw o r d s :n e tt r a n s m i s s i o n ;w i n s o c k ;m u l t i c a s t i n g ;c o m p r e s s i o n ;m u l t i t h r e a d i n g 项士学位论文 m a s t b r st h e s i s 华中师范大学学位论文原创性声明和使用授权说明 原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师指导下,独立进行研究工作 所取得的研究成果。除文中已经标明引用的内容外,本论文不包含任何其他个人或 集体已经发表或撰写过的研究成果。对本文的研究做出贡献的个人和集体,均已在 文中以明确方式标明。本声明的法律结果由本人承担。 懈名:势辛 吼伊 h a n d l e = = n u l l ) r e l e a s e d c ( 0 ,d e s k t o p c a n v a s - h a n d l e ) ; i f ( d e s k t o p c a n v a s ) d e l e t ed e s k t o p c a n v a s ;d e s k t o p c a n v a s = n u l l ; c o n t i n u e ; g r a p h i c s :t b i t m a p b i t m a p = n e wg r a p h i c s :t b i t m a p 0 ; b i t m a p - w i d t h = s c r e e n 一 w i d t h ; b i t m a p h e i g h t = s c r e e n h e i g h t ; i f ( b i t m a p - p i x e l f o r m a t p f l 6 b i t ) b i t m a p 一 p i x e l f o r m a t = p f l 6 b i t ; b i t m a p - c a n v a s - c o p y r e c t ( b i t m a p - c a n v a s - c l i p r e c t ,d e s k t o p c a n v a s ,d e s k t o p c a n v a s 一 c l i p r e 贮 t ) ; d e s k t o p c a n v a s - u n l o c k 0 ; 下面的语句将桌面位图保存到临时流t m p s t r e a m ,以便后面使用c o m p r e s s 2 来进行压缩。 b i t m a p - s a v e t o s t r e a m ( t m p s t r e a m ) ; r e l e a s e d c ( 0 ,d e s k t o p c a n v a s - h a n d l e ) ; d e l e t ed e s k t o p c a n v a s ;d e s k t o p c a n v a s = n u l l ; d e l e t eb i t m a p ; b i t m a p = n u l l ; 若有窗口正在m o v i n g s i z i n g ,则不向客户发送此屏图像。 i f ( ( ( b y t e 幸) w j g m e m + 5 ) ) c o n t i n u e ; 顾士学位论文 m a s t e r st h e s i s 下面开始压缩流,保存在t m p s t r e a m 中的是未压缩的位流。 l o n gi r t n u n e o m p r s i z e = t m p s t r e a m - s i z e ; b y t e p r t n u n c o m p r s t r e a m = ( b y t e 搴) t r n p s t r e a m 一 m e m o r y ; l o n gi r t n c o m p r s i z e = i r t n u n c o m p r s i z e + i r t n u n c o m p r s i z e | 1 0 0 0 七1 8 0 ; b y t e p r t n c o m p r s t r e a m = n e wb y t e i r t n c o m p r s i z e ; i f ( p r t n c o m p r s t r e a m = = n u l l ) s h o w m e s s a g e ( ”流压缩错误! ”) ;c x i t ( 0 ) ; i n te r r l = c o m p r e s s 2 ( p r t n c o m p r s t r e a m ,( u l o n g ) & l r t n c o m p r s i z e , p r t n u n c o m p r s t r e a m ,( u l o n g ) l i r t n u n c o m p r s i z e , z _ b e s t _ s p e e d ) ;z _ b e s tc o m p r e s s i o n ) ; i f ( e r r l ! = zo k ) 当发生压缩错误时,下面的语句用来手动删除缓冲。 d e l e t e 【】p r t n u n c o m p r s t r e a m ; p r t n u n c o m p r s t r e a m = n u l l ; d e l e t e 【】p r t n c o m p r s t r e a m ; p r m c o m p r s t r e a m = n u l l ; c o n t i n u e ; ) r 先释放t m p s t r e a m ,然后用它来保存压缩后的流。 t m p s t r e a m - c l e a r 0 ;f r e eo r i n i g a li m a g e d a t a t m p s t r e a m - w r i t e b u f f e r ( p r t n c o m p r s t r e a m ,i r t n c o m p r s i z e ) ; 压缩后的数据流在写入t m p s t r e a m 后即将p r t n c o m p r s t r e a m 删除 d e l e t e 【】p r t n c o m p r s t r e a m ; p r t n c o m p r s t r e a m = n u l l ; 至此,在发送屏幕图像之前,已完成的数据的压缩工作,在接收方收到数据后, 下面的代码段用来完成数据的解压工作。 u n p a c k - s e t s i z e ( i r e a l s i z e ) ; p r e c v s t r e a m = ( b y t e 幸x u n p a c k - m e m o r y ) ; 硕士学位论文 m a s t e r st h e s i s 下面的两行语句用来将p r e c v s t r e a m 所指向的已接收并拼装好的内存 ,数据流进行解压。 i f ( u n c o m p r e s s ( p r e c v s t r e a m ,( u l o n g 幸) & l r e a l s i z e ,p c o m p r b u f f e r , ( a l o n g ) i c o m p r s i z e ) ! = z _ o k 3 d e l e t e 【】p c o m p r b u f f e r ;p c o m p r b u f f e r = n u l l ; d e l e t e 【】p r e e v s t r e a m ;p r e e v s t r e a m = n u l l ; e l s e 如果解压成功,则将数据流所代表的屏幕位图显示到屏幕上。 t r y 【 d i s p l a y s c r e e n _ f o r m i m a g e l - p i c t u r e b i t m a p - l o a d f r o m s t r e a m ( u n p a c k ) ; s e t w i n d o w p o s ( d i s p l a y s c r e e n _ _ f o r m - h a n d l e , h w n d _ t o p m o s t , o ,0 ,s c r e e n 一 w i d t h ,s c r e e n 一 h e i g h t ,s w 瞄h o w w i n d o w ) ; c a t c h ( ) u n p a c k c l e a r 0 ; ) ; 3 2 图像广播与接收 在数据压缩解压问题已较好解决后,接下来需要解决的问题就是如何实现图像 的播出与接收。在第二章中已经讨论过w i n s o c k 程序设计,在这里将用到相应的 w i n s o c ka p i ,这些a p i 使我们能够在l a n 中传输经过压缩的数据,客户端则进行 数据接收并解压。 3 2 1 主机的数据发送 在系统服务器端和客户端的m a i n c p p 中,都有语句: i n t m a x d a t a g r a m s i z e = 6 0 0 3 0 , m o u s e m a x d a t a g r a m s i z e = 8 0 0 , d w d e l a y = 2 0 ; d w o r d d w i n t e r f a c e = i n a d d r :a ny , i p o r t s c r e e n = 2 5 0 0 0 , i p o r t m o u s e= 2 5 0 0 1 , d w m u l t i c a s t g r o u p _ s c r e e n = i n e t _ a d d r ( ”2 3 4 5 6 7 ”) , d w m u l t i c a s t g r o u p _ m o u s e = i n e t _ a d d r ( ”2 3 4 5 6 7 ”) ; 它们设置了图像数据报的最大字节数,鼠标数据报的最大字节数,相邻包发送 的延时间隔,并分别为屏幕图像,鼠标指针图像数据发送设置了不同的端口,至于 多播组地址,由于这两个不同的接收进程已经可以用端口号来区分,所以它们使用 了相同的多播组地址。 由于在无根的控制层面和数据层面,发送方和接收方的准备工作是 基本一样的,在讨论接收部分时,下面的代码将不再阐述。 s o c l ( _ e t s o c k f o r s c r e e n ,s o c k f o r m o u s e ; 定义了两个套接字,分别用于屏幕图像和鼠标指针图像及指针位置传输。 i n i t i a l i z i n gw i n s o c k 2f o rs e n dd a t at oc l i e n tm a c h i n e s - 一。一 d w i n t e r f a c e = i n e t _ a d d r ( l o c a l _ i p c _ s t r 0 ) ; i n t o p t v a l ,r o t ; i f ( w s a s t a r t u p ( m a k e w o r d ( 2 ,2 ) ,& w s d _ f o r _ e c l a s s ) ! = o ) m e s s a g e b o x ( h a n d l e , 初始化w i n s o c k 出错! ”,”提示 , m b _ i c o n e r r o r + m b _ o k ) ; e x i t ( 0 ) ; 创建用于多播屏幕图像的套接字,其原理已在上一章中讨论过了。 其参数设置了该套接字的属性。 顾士学位论文 m a s t e r st h e s i s i f ( ( s o c k _ f o r _ s c r e e n = w s a s o c k e t ( a f _ i n e t , s o c k _ d g r a m ,0 ,n u l l , 0 , w s a _ f l a g _ m u l t i p o i n t _ c _ l e a f iw s a _ f l a g _ m u l t i p o i n t _ d _ l e a f lw s a _ f l a g _ o v e r l a p p e d ) ) = = i n v a u d _ s o c r 茁t ) m e s s a g e b o x ( h a n d l e , 初始化w i n s o c k 出错,要求版本为2 0 1 ”, 提示 ”,m b _ i c o n e r r o r + m b o k ) ; w s a c l e a n u p o ; c x i t ( 0 ) ; s o c k f o r s c r e e n 绑定到本地端口以收发数据 1 0 c a l f o r s c r e e n s i n _ f a m i l y = a f 碟r e t ; l o c a l f o r s c r e e n s i n _ p o r t= h t o n s ( i p o r t _ s c r e e n ) ; l o c a l f o r s c r e e n s i n _ a d d r s _ a d d r = d w i n t e f f a c e ; i f ( b i n d ( s o c kf o rs c r e e n , ( s t r u c ts o c k a d d r ) & l o c a lf o rs c r e e n , s i z e o f ( 1 0 c a l _ f o r _ s c r e e n ) ) = = s o c k e t _ e r r o r ) m e s s a g e b o x ( h a n d l e , 初始 w i n s o c k 出错! ”,”提示 , m bi c o n e r r o r + m b _ o k ) ; c l o s e s o c k e t ( s o c kf o rs c r e e n ) ; w s a c l e a n u p o ; e x i t ( o ) ; 建立s o c k a d d r _ i n 结构用来描述将加入的多播组。 r e m o t e _ f o r _ s c r e e n s i n _ f a m i l y = a f _ i n e t ; r e m o t e _ f o r _ s c r e e n s i n p o r t = h t o n s ( i p o r t _ s c r e e n ) ; r e m o t e _ f o r _ s c r e e n s i n _ a d d r s _ a d d r = d w m u l t i c a s t g r o u p _ s c r e e n ; 设置t r l 为恰当的值 硕士学位论文 m a s t e r st h e s i s o p t v a l = 1 ; f f ( s e t s o c k o p t ( s o c kf o rs c r e e n 。i p p r o t o _ i p , i p _ m u l t i c a s z 刀乙 ( c h a r 毒) & o p t v a l ,s i z e o f ( i n t ) ) = = s o c k e t _ e r r o r ) p r i n t f ( ”s e t s o c k o p t ( i p _ m u l t i c a s t _ t r l ) f a i l e d :d ”, w s a g e t l a s t e r r o r 0 ) ; c l o s e s o c k e t ( s o c k _ f o r _ s c r e e n ) ; w s a c l e a n u p o ; e x i t ( o ) ; 以下类似的代码用于鼠标图像及指针位置的传输 i f ( ( s o c kf o rm o u s e = w s a s o c k e t ( a f _ i n e t , s o c kd g r a m ,0 ,n u l l , 0 , w s af l a g _ m u l t i p o i n t _ c _ l e a f iw s a :f l a g m u l t i p o i n t d l e a f iw s a _ f l a g _ o v e r l a p p e d ) ) = = i r c v a h d _ s o c k e t ) m e s s a g e b o x ( h a n d l e , 初始化w i n s o c k 出错! ”, 提示 , m bi c o n e r r o r + m b o k ) ; p d a t f ( ”s o c k e tf a i l e dw i t h :d ”,w s a g e t l a s t e r r o r 0 ) ; w s a c l e a n u p 0 ; e x i t ( 0 ) ; 绑定到本地接口以收发数据 1 0 c a lf o r _ m o u s e s i n _ f a m i l y = a f _ i n e t ; l o c a l f o r m o u s e s i np o r t = h t o n s ( i p o r tm o u s e ) ; l o c a l f o rm o u s e s i na d d r sa d d r = d w h t e f f a c e ; i f ( b i n d ( s o c kf o rm o u s e ,( s t r u c :ts o c k a d d r 幸) & l o c a lf o rm o u s e , s i z e o f ( 1 0 c a l f o rm o u s e ) ) = := s o c k e t _ e r r o r ) m e s s a g e b o x ( h a n d l e , 初始化w i n s o c k 出错! ”,”提示 , m b _ i c o n e r r o r 顾士学位论文 m a s t e r st h e s i s + m b _ o k ) ; c l o s e s o c k e t ( s o c kf o rm o u s e ) ; w s a c l e a n u p o ; e x i t ( 0 ) ; r e m o t e f o r m o u s e s i n _ f a m i l y = a f _ i n e t ; r e m o t e f o r m o u s e s i np o r t= h t o n s ( i p o r t _ m o u s e ) ; r e m o t e f o r m o u s e s i n _ a d d r s _ a d d r = d w m u l t i c a s t g r o u p _ m o u s e ; i f ( s e t s o c k o p t ( s o c kf o rm o u s e ,i p p r o t o _ i p , i p _ m u l t i c a s t _ t i l ( c h a r 枣) & o p t v a l ,s i z e o f ( i n t ) ) = = s o c k e t _ e r r o r ) p r i n t f ( ”s e t s o c k o p t ( i p _ m u l t i c a s t 邢,) f a i l e d :d 、n , w s a g e t l a s t e r r o r 0 ) ; e l o s e s o c k e t ( s o c k _ f o r _ m o u s e ) ; w s a c l e a n u p 0 ; e x i t ( 0 ) ; ) 下面的代码用来加入多播组,s o c k m l 和s o c k m 2 并不是用来收发数据的,在 客户端要离开它,调用c l o s e s o c k e t 时要用到它。在无根的控制层面和数据 层面,w s a j o i n l e a f 返回的s o c k 值与传入的值相同。 i f ( ( s o c k m l = w s a j o i n l e a f ( s o c kf o rs c r e e n ,( s o c k a d d r 宰) & r e m o t ef o rs c r e e n , s i z e o f ( r e m o t ef o rs c r e e n ) ,n u l l , n u l l , n u l ln u l l , j l _ b o t i - i ) ) = := i n v a l i d _ _ s o c i 娅t ) c l o s e s o c k e t ( s o c kf o rs c r e e n ) ; w s a c l e a n u p 0 ; e x i t ( 0 ) ; 顾士学位论文 m a s t e r st h e s i s i f ( ( s o c k m 2 = w s a j o i n l e a f ( s o c kf o rm o u s e ,( s o c k a d d r 掌) & r e m o t ef o rm o u s e , s i z e , o f ( r e m o t ef o rm o u s e ) ,n u l l , n u l l , n u l l , n o l l , j l _ b o t i - i ) ) = = i n v a l i d _ s o c k e t ) c l o s e s o e k e t ( s o c kf o rm o u s e ) ; w s a c l e a n u p o ; e x i t ( o ) ; 在主程序中,系统已完成了w i n s o c k 的多播准备工作,在启动发送操作后,即 可向学生机开始广播发送两种图像数据,显然,主机是不会理会学生机是否已准备 好接收工作,它只负责将压缩后的数据按指定的时间间隔进行播发,直到被要求停 止操作。 下面的代码用于将教师机的屏幕图像压缩数据流向学生机进行广播: s e n d t o ( s o c k _ f o r _ s c r e e n ,( p u c h a r ) w i u s e n d s t r m 一 m e m o r y , w i u s e n d s t r m 一 s i z e ,0 ,( s o c k a d d r 簟) & r e m o t ef o rs c r e e n ,s i z e o f ( r e m o t ef o rs c r e e n ) ) ; 类似的还有发送鼠标图像与指针位置的语句。上述语句中w i l l s e n d s t r m 为经过 压缩的屏幕图像的内存流,m s d n 对s o c k e t 函数选择s o c k _ d g r a m 类型时,给 出了下面的说明: s u p p o r t sd a t a g r a m s ,w h i c ha 咒c o n n e c t i o n l e s s ,u n r e l i a b l eb u f f e r so f af i x e d ( t y p i c a l l ys m a l l ) m a x i m u ml e n g t h ,u s e su d p f o rt h ei n t e r n e ta d d r e s sf a m i l y 可见,在广播发送数据报时,每次广播的数据报是有最大长度的,此最大长度 为6 4 k 字节。在广播过程中,经常出现图像压缩后其数据流仍大于6 4 k 字节,这 就给广播大图像带来一个难题:如何广播发送经常遇到的经过压缩仍大于6 4 k 的屏 幕图像? 这一问题的算法实现将在随后的小节中讨论。下面先来看一下客户机对主 机屏幕图像数据的接收。 3 2 2 客户机的数据接收 为接收主机广播来的数据包,客户机必须建立套接字,加入一个相应的多播组, 在指定的端口监听数据报到来,进行接收并显示,为接收数据,客户端还必须准备 足够的缓冲来存放接收的数据包。这些工作与发送方基本是一样的。 为接收数据,接收方必须准备缓冲,下面的语句完成了这项工作: 3 1 硕士学位论文 m a s t e r st h e s i s t f i l e s t r e a m 宰w r i t e _ d i s k _ f i l e _ s t r m = n u l l ; d a t a b u f f e r = ( p u c h a r ) g l o b a l a i l o c ( g m e m _ f i x e d , m a x _ d a t a g r a m _ s i z e ) ; 屏幕图像压缩数据的接收则由下面的语句来完成,该语句用来接收发送过来的 屏幕图像数据报并存入d a t a b u f f e r 中,d a t a s i z eo fr e c e i v e s c r e e n 用来标识所收到 的数据报的长度。 d a t a s i z e o f r e c e i v e s c r e e n = r e c v f r o m ( s o c k _ f o r _ s c r e e n ,d a t a b u f f e r , m a x _ d a t a g r a m s i z e ,0 ,( s o c k a d d r 母) & f r o m ,& l e n ) ; 接下来即可对收到的数据包压缩,并显示到桌面。 很显然,如果不管什么的图像,主机都是用一个数据报发送过来的,那么客户 机的接收也就变得很容易,一个语句就能完成一帧屏幕图像的完整接收,整个代码 将变得非常简明。而实际情况在3 2 1 中已经提出来了,发送方将会对6 4 k 以上数 据包分解发送,而接收方也只得对这样的数据报进行接收,组装,显示。在下面的 3 3 中将重点讨论这一个问题,这也将是本文的重点所在。 3 3 大于6 4 k 图像的处理 在3 1 与3 2 中已讨论了图像的压缩、数据报多播、接收的实现,在理想模式 下,如果每帧图像的发送都可以用一个数据包解决,整个系统设计将可大为简化, 而实际情况并非如此,因为多播数据报的最大尺寸应小于“k 字节,况且这6 4 k 字节的数据报中还有一部分要用于控制等,这使得我们必须将大于6 4 k 的数据包进 行切割,然后编号发送,在接收方进行组装显示。但这又会带来更多的问题,因为 数据报的发送是不可靠的,如果一帧图像压缩后须分解为三个包进行发送,而收方 在接收时未能成功的接收到全部的片段,这就意味着它所收到的此图像的其他几个 压缩片段都不再有任何作用,有人可能会问,如果发现某个包丢失了,为什么不请 求主机重发该包呢? 由于图像广播需要的是实时传输,如果允许接收方不断的对未收到的包片段提 出重发请求,且主机也必须对此请求作出响应,这将会使系统运行极不稳定,图像 传输的时延大大增加,况且如果是多个客户向主机发送这样的请求,就更可能带来 灾难性的后果。 因此可以考虑,在网络状况较好的情况下,丢包情况不会很严重,如果对一帧 图像的压缩包发送时,尺寸超过指定的最大值,则将其分解成了若干个片段,如果 某个片段丢失,客户机将抛弃与此帧图像相关的其他几个片段,转而去接收新的一 3 2 硕士学住论文 m a s t e r st h e s i s 帧图像的若干个片段。 为此,可在待发送数据报前加入2 0 个字节的报头信息部分,其格式如表3 - 1 所示: 压缩后分割的第i 个数据片段字节 | 0 123456 流。 表3 - 1 数据包的结构 第0 字节中存放数据报类别编号:包括屏幕图像指针图像其他用于远程控制 信号; 第1 字节中存放图像帧的编号,由于1 个字节只能产生2 5 6 个编号,故该字节 值将在0 - 2 5 5 这个窗口内循环;, 第2 字节中存放组成该帧图像的数据报的个数; 第3 字节中存放片段编号,如果第j 帧图像由k 个数据报组成,则第j 帧图像 的片段编号范围为1 、2 、k ; 第4 、5 、6 字节中存放原始的未压缩图像的尺寸,以便接收方解压时开辟相应 的缓冲,这三个字节可表示的最大值为1 6 m b ,显然一般图像尺寸不会超过这个值; 第7 至1 9 字节为预留空间; 其后的6 0 余k b 用于存放当前图像压缩后分割出来的第i 个数据片段字节流, 当然,根据第o 字节中所记载的数据报类型的不同,这里存放的也可能是别的数据 信息。 以上定义了数据报的内部数据结构,这样的数据报流广播到客户端时,客户机 再根据数据报中的头部信息来进行相应处理。 下面的代码实现任何尺寸压缩图像的数据发送。 首先求得当前压缩数据需分解为多少个数据报。l r t n c o m p r s i z e 在讨论压 缩算法时已出现过了,它是一次成功压缩后返回的数据尺寸。 b y t ed w n u m d a t a g r a m s = i r t n c o m p r s i z e m a x d a t a g r a m s i z e ; i f ( 1 r t n c o m p r s i z e m a x d a t a g r a m s i z e ! = 0 ) d w n u m d a t a g r a m s + + ; 包的第0 字节中放入包类型编码 p a c k _ h e a d e r _ i n f o 0 】= d a t a p a c k _ i n f o _ _ t y p e _ c o d e ; 图像的编号总是在0 2 5 5 这个窗口中循环,第1 字节中放入图像的流水号 硕士学位论文 m a s t e r st h e s i s p i c _ n o = ( + + p i c ! 州2 5 5 ; p a c k _ h e a d e r _ i n f o 1 】= p i c _ n o ; 包的第2 字节放入当前帧图像共被分解为多少个包 p a c k _ h e a d e r _ i n f o 2 】= d w n u m d a t a g r a m s ; 在包头的4 _ 6 共3 个字节中存放原始的未压缩图像的尺寸 p a e k _ h e a d e r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论