阿里妈妈,帮你实现网络赚钱梦,流量变成现金!
09-05
25

[原]用C#做远程监控程序(一)

给力技术 - 给您提供最新最全的Web资源       用C#做远程监控程序(二)
         用C#做远程监控程序(三)
      最近在做的C/S程序要加入远程监控的功能,于是去搜索怎么用C#来做这个功能,然后看了一些资料。最后有了一点点思路,远程监控其实就是总结出来一个大概的流程:

      首先,实时的将被监控端的屏幕截图并发送到监控端。
      然后,把本地的鼠标和键盘事件的值传到远程,然后再远程模拟出来。

      有了想法那就开始做吧,先做第一步

    一、屏幕截图并发送到服务器端
      先要让客户端连接到服务器端,用的是TCP连接
                
socket = new TcpClient(serveraddress, serverport);
                ns = clientsocket.GetStream();

      然后启动一个线程来截图,截图的代码可以看 C#截图代码。 可以在连接服务器之后就启动这个线程,我现在的是让服务器发一个命令到客户端,然后客户端再用一个线程来不断侦听服务器发来的消息,如果收到截图的命令,那么再启动截图。
      截下的图片保存在内存流中,要注意的一点是,在调用了SAVE方法之后要重新设置流的位置为0
    
MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    //将图片写入流,但是流的当前位置会改变(在流的末端)
    ms.Position = 0;
    //在调用ms.Read方法之前重设流的当前位置


      截图已经完成,接下来就是要传送图片了。一次发送完整个图片是不好的,所以我们要把它分块传输。我设置了1024字节的缓冲区,循环发送数据。

    
while (sendCount < ms.Length)               //分块传送
                {
                    sendBuf = new Byte[1024];                
                    int count = ms.Read(sendBuf, 0, sendBuf.Length);  //从图片中读出数据
                    ns.Write(sendBuf, 0, count);
                    sendCount += count;                                
                }

      分块传输这部分需要改进,因为我只发送数据的内容,而没有发送数据的长度。如果有数据丢失,服务器也检查不出来,潜在的隐患。
      图片发送完了要再发个结束标志,当服务器接收到这个结束标志后就可以显示图片了。下面就到写服务器端的接收代码了,代码也比较简单,就是用一个循环不断的接收,直到收到数据的长度为零。
    
Byte[] buffer = new Byte[1024];
                int count = socket.Receive(buffer);

                while (count != 0)
                {
                    if (count == 4)
                        break;
                    try
                    {
                        ms.Write(buffer, 0, count);             //写入内存流
                        buffer = new Byte[1024];
                        Byte[] tempbuff = new Byte[1024];
                        count = socket.Receive(tempbuff);
                        buffer = tempbuff;
                    }
                    catch (Exception ex)
                    { }
                }

      将内存流再转换为图片,然后显示出来,我用的是PictureBox,下面是显示图片的代码
Image image = Image.FromStream(ms);
                    picScreen.Image = image;
                    ms.Flush();
                    ms = new MemoryStream();

      到这里基本上就实现了第一步的功能,可以看到客户端的桌面了,小小的高兴一下~~~~不过还有一些问题,显示的速度慢,正在想办法解决这个问题。图片应该要压缩下,也许不传整张图片也是一个比较好的办法。

[本日志由 老狼 于 2011-03-14 11:27 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
文章标签: c# TCP 截图 远程
网摘收录:
相关日志:
发表评论
昵 称:
密 码: 游客发言不需要密码.
邮 箱: 支持Gravatar头像.
网 址: 输入网址便于回访.
内 容:
验证码:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.