当前位置:编程学习 > C#/ASP.NET >>

C# 屏幕监控问题

请帮助下小弟!自连的话可以看到自己,让别人连的话就错误了,客户端报错


以下是服务端:
using System;
using System.Collections.Generic;
using System.ComponentModel;

using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO; 

namespace s
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private NetworkStream ns = null;
        private StreamReader sr = null;
        private StreamWriter sw = null;
        private Thread tcpThread = null;
        private TcpClient tcpclient = null;
        MemoryStream ms = null;
        bool isCon = false;
        bool isError = false;

        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        private static extern IntPtr CreateDC(
              string lpszDriver, // 驱动名称 
              string lpszDevice, // 设备名称 
              string lpszOutput, // 无用,可以设定位"NULL" 
              IntPtr lpInitData // 任意的打印机数据 
            );
        [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
        private static extern bool BitBlt(
        IntPtr hdcDest, //目标设备的句柄 
        int nXDest, // 目标对象的左上角的X坐标 
        int nYDest, // 目标对象的左上角的X坐标 
        int nWidth, // 目标对象的矩形的宽度 
        int nHeight, // 目标对象的矩形的长度 
        IntPtr hdcSrc, // 源设备的句柄 
        int nXSrc, // 源对象的左上角的X坐标 
        int nYSrc, // 源对象的左上角的X坐标 
        System.Int32 dwRop // 光栅的操作值 
        ); 


        private void timer1_Tick(object sender, EventArgs e)
        {
            if (!isCon)
            {
                con();
                if (!isError)
                {
                    timer1.Enabled = false;
                    tcpThread = new Thread(new ThreadStart(connect));
                    tcpThread.Start();

                }
                isError = false;
            } 

            
               
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.label1.Text = "程序启动中....\r\n";
            timer1.Enabled = true; 
        }

      

        public void con()
        {
            try
            {
                this.label1.Text += "连接中.....\r\n";
                tcpclient = new TcpClient();
                tcpclient.Connect("119.130.241.45", 9421);
                if (tcpclient.Connected)
                {
                    ns = tcpclient.GetStream();
                    sr = new StreamReader(ns);
                    sw = new StreamWriter(ns);
                    isCon = true;
                    this.label1.Text += "连接成功\r\n";
                }
                //isError = true; 
            }
            catch
            {
                isError = true;
                this.label1.Text += "连接失败!\r\n";
            }
        }


             public void capture() 

         { 
             //this.Visible = false; 
             IntPtr dc1 = CreateDC("DISPLAY", null, null, (IntPtr)null); 
             //创建显示器的DC 
             Graphics g1 = Graphics.FromHdc(dc1); 
             //由一个指定设备的句柄创建一个新的Graphics对象 
             System.Drawing.Image MyImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, g1); 
             //根据屏幕大小创建一个与之相同大小的Bitmap对象 
             Graphics g2 = Graphics.FromImage(MyImage); 
             //获得屏幕的句柄 
             IntPtr dc3 = g1.GetHdc(); 
             //获得位图的句柄 
             IntPtr dc2 = g2.GetHdc(); 
             //把当前屏幕捕获到位图对象中 
             BitBlt(dc2, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc3, 0, 0, 13369376); 
             //把当前屏幕拷贝到位图中 
             g1.ReleaseHdc(dc3); 
             //释放屏幕句柄 
             g2.ReleaseHdc(dc2); 
             //释放位图句柄 
             ms = new MemoryStream(); 
             MyImage.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
             ms.Position = 0;
             byte[] b =ms.GetBuffer();

              Thread.Sleep(500);//延迟了

             ns.Write(b, 0, b.Length); 
             ms.Flush(); 

            // this.pictureBox1.Image = Image.FromStream(ms); 
             //this.Visible = true; 



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



             public void connect()
             {
                 try
                 {

                     while (true)
                     {
                         capture();
                     }

                 }
                 catch (Exception ex)
                 {
                     //   MessageBox.Show(ex.Message); 
                     //   MessageBox.Show("错误!===\\\\"+ex.Message ); 
                     sw.Dispose();
                     sr.Dispose();
                     ns.Dispose();
                     isCon = false;
                     isError = false;
                     timer1.Enabled = true;
                     this.label1.Text += "远程主机被断开~!";
                 }
             } 


    }
}


以下是客户端:
using System;
using System.Collections.Generic;
using System.ComponentModel;


using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.IO; 

namespace c
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }





        private TcpListener tcp = null;
        private Socket socket = null;
        private NetworkStream ns = null;
        private StreamReader sr = null;
        private StreamWriter sw = null;
        private Thread tcpThread = null; 



        private void Form1_Load(object sender, EventArgs e)
        {
            tcpThread = new Thread(new ThreadStart(getRemote));
            tcpThread.Start(); 
        }

        public void getRemote()
        {
            IPAddress ip = IPAddress.Parse("119.131.10.172");
            tcp = new TcpListener(ip, 9421);
            tcp.Start();
            socket = tcp.AcceptSocket();
            ns = new NetworkStream(socket);
            sr = new StreamReader(ns);
            sw = new StreamWriter(ns);
           
            if (socket.Connected)
            {

                try
                {

                    while (true)
                    {

                        byte[] b = new byte[4000 * 3000];   //设置接收的大小 
                        int i = this.socket.Receive(b);//接收 
                        //把byte[]转化成内存流,在把内存流转化成Image, 
                        System.Drawing.Image myimage = System.Drawing.Image.FromStream(new MemoryStream(b));
                        showScreen.Image = myimage; //显示 


                      
                    } 
                   


                  //  MessageBox.Show("连接成功!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    this.tcp.Stop();
                    MessageBox.Show("捕捉屏幕出错!server" + ex.Message);   //这里报错了
                }
            }
        }



        

    }
}  --------------------编程问答-------------------- up --------------------编程问答-------------------- 先确定一下
通讯成功没有? --------------------编程问答-------------------- tcpclient.Connect("119.130.241.45", 9421); 要连接的ip为你自己的ip --------------------编程问答-------------------- 太长了,没有时间看,直接把错误贴出来,分析错误,解决错误罢。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,