프로젝트/원격 제어 프로그램 만들기

원격 제어 프로그램 만들기 9. 화면 수신 서버

언제나휴일 2020. 5. 12. 21:19
반응형

 

원격 제어 컨트롤러에서는 호스트 화면을 주기적으로 수신하여 이를 폼에 뿌려주어야 합니다. 이를 위해 화면을 수신하는 서버 클래스의 소스 코드입니다.

소스 코드

ImageServer.cs

//ImageServer.cs
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Drawing;
using System.IO;
using System;

namespace 원격제어기
{
    /// <summary>
    /// 이미지 수신 서버
    /// </summary>
    public class ImageServer
    {
        Socket lis_sock; //Listening 소켓
        Thread accept_thread = null; 

        /// <summary>
        /// 이미지 수신 이벤트
        /// </summary>
        public event RecvImageEventHandler RecvedImage = null;

        /// <summary>
        /// 생성자
        /// </summary>
        /// <param name="ip">로컬 IP</param>
        /// <param name="port">포트</param>
        public ImageServer(string ip, int port)
        {
            //소켓 생성            
            lis_sock = new Socket(AddressFamily.InterNetwork, 
                                  SocketType.Stream, 
                                  ProtocolType.Tcp);

            //EndPoint와 소켓 결합
            IPAddress ipaddr = IPAddress.Parse(ip);
            IPEndPoint ep = new IPEndPoint(ipaddr, port);
            lis_sock.Bind(ep);

            //Back 로그 큐 크기 설정
            lis_sock.Listen(5);


            //연결 수용 Loop을 수행하는 스레드 시작
            ThreadStart ts = new ThreadStart(AcceptLoop);
            accept_thread = new Thread(ts);
            accept_thread.Start();
        }

        void AcceptLoop()
        {
            try
            {
                while (lis_sock != null)
                {
                    Socket do_sock = lis_sock.Accept();//연결 수락
                    Receive(do_sock);//do_sock으로 이미지 수신
                }
            }
            catch
            {
                Close();
            }
        }

        void Receive(Socket dosock)
        {
            byte[] lbuf = new byte[4]; //이미지 길이를 수신할 버퍼
            dosock.Receive(lbuf); //이미지 길이 수신
            int len = BitConverter.ToInt32(lbuf, 0);//수신한 버퍼의 내용을 정수로 변환
            byte[] buffer = new byte[len];//이미지 길이만큼의 버퍼 생성
            int trans = 0;
            while (trans < len)//수신할 이미지 데이터가 남아있으면
            {
                trans += dosock.Receive(buffer, trans, 
                                        len - trans, 
                                        SocketFlags.None);//이미지 수신
            }
            if (RecvedImage != null)//이미지 수신 이벤트가 존재하면
            {
                //이미지 수신 이벤트 발생
                IPEndPoint iep = dosock.RemoteEndPoint as IPEndPoint;
                RecvImageEventArgs e = new RecvImageEventArgs(iep, ConvertBitmap(buffer));
                RecvedImage(this, e);
            }
            dosock.Close();//소켓 닫기
        }
        /// <summary>
        /// 수신한 버퍼를 비트맵 이미지로 변환 메서드
        /// </summary>
        /// <param name="data">수신한 버퍼</param>
        /// <returns>비트맵 이미지</returns>
        public Bitmap ConvertBitmap(byte[] data)
        {
            MemoryStream ms = new MemoryStream();
            ms.Write(data, 0, (int)data.Length);//메모리 스트림에 버퍼를 기록
            Bitmap bitmap = new Bitmap(ms); //메모리 스트림으로 비트맵 개체 생성
            return bitmap;
        }
        /// <summary>
        /// 비트맵 이미지 서버 닫기 메서드
        /// </summary>
        public void Close()
        {
            if (lis_sock != null)
            {
                lis_sock.Close();
                lis_sock = null;
            }
        }
    }
}

 

 

원격 제어 프로그램 9. 원격 제어 – 화면 수신 서버 – 언제나 휴일

원격 제어 컨트롤러는 원격 제어 호스트의 화면을 주기적으로 수신하여 이를 보면서 제어합니다. 이제 원격 제어 화면을 수신하는 ImageServer 클래스를 구현합시다. public class ImageServer { public class

ehpub.co.kr

 

반응형