반응형
원격 제어 컨트롤러에서는 호스트 화면을 주기적으로 수신하여 이를 폼에 뿌려주어야 합니다. 이를 위해 화면을 수신하는 서버 클래스의 소스 코드입니다.
소스 코드
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;
}
}
}
}
반응형
'프로젝트 > 원격 제어 프로그램 만들기' 카테고리의 다른 글
화면 캡쳐 및 이미지 송신 클라이언트 및 수신 서버 구현하기 (0) | 2020.05.12 |
---|---|
원격 제어 프로그램 만들기 8. 화면 수신 이벤트 인자 클래스 구현 (0) | 2020.05.12 |
원격 제어 프로그램 만들기 7. 원격 제어 – 화면 전송 (0) | 2020.05.12 |
원격 제어 프로그램 만들기 - 6. 원격 제어 요청 수신 서버 구현 및 요청 수신 1차 테스트 (0) | 2020.05.09 |
원격 제어 프로그램 만들기 - 5. 원격 제어 요청 수신 이벤트 인자 클래스 구현 (0) | 2020.05.09 |