博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
远程控制(2)
阅读量:5242 次
发布时间:2019-06-14

本文共 1737 字,大约阅读时间需要 5 分钟。

二.接收
上面已经讲到如何将数据包发送出去,剩下的就是接收,和控制
既然发送端是用upd发送,那么接收端当然也是用udp接收(好多废话哦)
简单点,用个循环将接收到的包按包号写入内存,然后在内存中读取数据,还原图片,具体步骤如下:
接收包-->按包号计算偏移-->接收到最后一个包-->写入-->还原图片-->显示
          |          |
      写入内存(循环)     
很简单是吧,假如要考虑到其他的问题的话,那么就会复杂一点,上面所有动作将放在一个单独线程执行
  (1)接收包
     
   IPEndPoint hostPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] recv 
=
 ReceClient.Receive(
ref
 hostPoint);
UdpClient的Receive是总是阻塞的,直到有数据包的到来,接受到字节后,还要进行分解,上面漏了一步,根据我们发包的内容,我们可以知道包内各个位置放着的是什么数据
0-3     包号
4-?     包内容
?-end 包内容长度
为什么用?呢,这个就关系到这个数据包的设计问题了.现在想想真的是一大失败.由于包内容的长度不一定是固定的,包内容长度用来描述包内容长度,在读取的时候就有点麻烦,如下
for
 (
int
 i 
=
 
0
; i 
<
 
4
; i
++
)
{
    Num[i] 
= recv[i];
    length[i] 
= recv[recv.Length - 4 + i];
}
每次都要用包长度-4来获取包内容长度.假如开始我们的数据包设置成
        
struct
 ImageBlock
        
{
            
public int Num;           
                public int ContentLen;
            
public Byte[] Content;
        }
那么就会好很多
0-3     包号
4-7     包内容长度
7-end 包内容
获取包号和长度之后,就可以写入内存中相应的位置了.
计算?    
MemoryStream iStream 
=
 
new
 MemoryStream();
iStream.Position 
=
 block.Num 
*
 
2040
;
   iStream.Write(block.Content, 0, block.ContentLen);
一般来说,只要不是最后一个包的话,每包数据量都是2040,所以......虽然我觉得有点汗,但是还是这样处理算了.同时还有一个问题,udp包按顺序发,但不一定是按顺序接收.先看看这里
if
 (block.Num 
==
 
-
1
)
{
        Image memoryImage 
= new Bitmap(iStream);
        ImagePanel.BackgroundImage 
= memoryImage;
 }
记得上次发包的时候将最后一个包包号写成-1 吧,假如这个包在其他包接收到之前就已经被接收,那么内存中的数据就会立刻被转成图片,并且显示.那么后来来到的那些包呢(我指同一张图片的),没有丢,也接收了,不过已经失去了意义.虽然在局域网里这个情况不是很明显,但是在internet上的话,就很大问题了.所以用udp还是有那么一点痛苦.所以,我们可以改用tcp了(面向连接),顺序就不会搞错,耗点资源也值得.同时也有其他的一些方法,用udp也能够完成类似tcp的任务,我还没弄,只是知道有,就不介绍了
到这里,一张图片的接收就完成了
,怎么显示?对哦,还没说.....我用的是panel.  ImagePanel.BackgroundImage.很简单吧.在显示之前,要设置好panel大小,意思就是获得对方屏幕的大小,怎么做就不说了,和上面说的一样.传~~~~
获取屏幕大小的方法:
Screen.AllScreens[0].Bounds.Size;
假如对方有多个显示器的话......那...一般都是一个啦.....0就是第一个
好,有画面显示了.下面就开始控制
友情提示:
如需转载本文,请遵守" "并加入下面声明 且注明原文链接。
作者:kevin wu
来源:

转载于:https://www.cnblogs.com/kevin-wu/archive/2007/01/01/609417.html

你可能感兴趣的文章
关于字节对齐的理解
查看>>
处理跨域的方式
查看>>
sqlplus中break命令的使用
查看>>
由于SVN导致桌面图标都带有?标记
查看>>
C++容器在遍历时的删除问题
查看>>
C#编程语言与面向对象——类与对象
查看>>
Openstack: change endpoint IP addresses after installation
查看>>
仿新浪微博的ListView下拉更新功能
查看>>
胆小勿入!!万圣节特效
查看>>
linux find 命令
查看>>
ios fixed定位问题
查看>>
Entity Framework 4.1 Code-First 学习笔记
查看>>
Android开发——Fragment知识整理(一)
查看>>
一些奇思幻想
查看>>
半分钟内能看透问题本质的人是如何思考的?
查看>>
EL表达式和JSTL
查看>>
网站并发低解决
查看>>
MSTest、NUnit、xUnit对照表
查看>>
洛谷P1162 填涂颜色【BFS】
查看>>
sql根据'/'截取最后的字符串
查看>>