我想做个象VNC那种远程软件
我现在能让CLIENT端截当前桌面的图,但是发送不到服务端,我对于TCP/IP这块编程不是很懂,请问该怎么做啊CLIENT:
 private void button2_Click(object sender, EventArgs e)
        {
            Image MyImg = GetDesktopImage();
            MemoryStream ms = new MemoryStream();
            MyImg.Save(ms, ImageFormat.Jpeg);            byte[] send = ms.GetBuffer();
            try
            {
                TcpClient m_client = new TcpClient("127.0.0.1", 12345);
                NetworkStream stream = m_client.GetStream();
                stream.Write(send, 0, send.Length);
                stream.Close();
                m_client.Close();
            }
            catch (SocketException aa)
            {
                MessageBox.Show(aa.Message);
            }
        }
--------------------------------------------------------------------------
SEVER:
TcpListener m_server;
        TcpClient m_client;        private void Form1_Load(object sender, EventArgs e)
        {
            m_server = new TcpListener(12345);
            try
            {
                //m_server=server;
                textBox1.Text = "已经开始了";
                m_server.Start();                Thread m_thread = new Thread(new ThreadStart(GetConn));//开启线成
                m_thread.Start();//运行
            }
            catch (SocketException ae)
            {
                MessageBox.Show("错误源" + ae.Source + "表示" + ae.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }        private void GetConn()//线成函数
        {
            m_client = m_server.AcceptTcpClient();
            TcpClient c = this.m_client;
            Thread m_thread = new Thread(new ThreadStart(GetConn));
            m_thread.Start();
            NetworkStream stream = c.GetStream();
            byte[] recv = new byte[999999];
            string msg = "";
            string temp;
            try
            {
                int a = 0;
                a = stream.Read(recv, 0, 999999);
                if (a > 0)
                {
                    MemoryStream ms = new MemoryStream(recv);
                    Image image = Image.FromStream(ms, true);                    pictureBox1.Image = image;
                }
                stream.Close();
                c.Close();
            }
            catch (SocketException es)
            {
                MessageBox.Show("错误源" + es.Source + "表示" + es.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

解决方案 »

  1.   

    我错了,现在图是能发过来,但是我想做成象VNC那种很流畅的远程监视,但是我如果在客户端加个定时器不停的发图的话,会很卡……而且极不流畅
      

  2.   

    强烈要求版主处理楼上那个人,烦的很,完全是广告,一点实质东西都没有-----------一张一张传估计数据太大,如果非要这样,可以找个Zip库把流数据压缩了再传输,BMP图片的经过压缩后可以很有效,
    另外的办法就是把位图序列制作成MPG视频流,这个估计比较复杂,我也不太懂
      

  3.   

    楼主很聪明啊,居然想到用递归监听客户端,我都是用while(boo)的如果说你的程序卡我估计是大量的资源都用在io上了,每一张图都开一个关一个straem会用很多资源的如果我是你就在两边都建里一个缓冲池攒够数量了在发一次.如果不建缓冲池,建立用异步的straem读/存,反正象你这么做太费资源了你是不是想再客户端用一个 Timer自动发
      

  4.   

    我也想过VNC的问题,
    VNC问题是建立在TCP/IP协议基础上的,
    所以应该是客户端发起指令,服务器端返回图象,
    第一,主要是一个图象差的算法,VNC并不是把服务器端所有的图象传过来,那样太慢了,
    传过来的是一个图象差值,传到客户端后再根据图象差值来显示在客户端,
    这个算法是相当了不起的,我找了很多资料都没有关于.NET算图象差值的.
    第二,是关键在于传输的速度,需要用到压缩技术,把差值来压缩传输,这个算法在互联网有很多.
    第三,是模拟鼠标的点击.要按简化到指命传输,总之感觉很难,如果楼主写出来了,请一定要跟大家讲讲你的算法.