1. 유튜브 동영상 강의
2. 원격 제어 이벤트 전송 클라이언트
이제 원격 제어 컨트롤러에서 발생하는 키보드와 마우스 이벤트를 전송하는 SendEventClient 클래스를 구현합시다.
전송하고 수신할 메시지 종류를 열거형으로 정의합시다.
public enum MsgType//원격 제어 이벤트 종류
{
MT_KDOWN = 1, MT_KEYUP, MT_M_LEFTDOWN,
MT_M_LEFTUP, MT_M_RIGHTUP, MT_M_RIGHTDOWN,
MT_M_MIDDLEDOWN, MT_M_MIDDLEUP, MT_M_MOVE
}
이벤트를 전송하는 SendEventClient를 작성합시다.
public class SendEventClient
{
원격 제어 호스트의 IP 단말을 멤버 필드로 선언하세요.
IPEndPoint ep;
생성자에서는 상대측 IP와 포트를 입력인자로 받아서 IPEndPoint 개체를 생성합니다.
public SendEventClient(string ip, int port)
{
//원격 제어 호스트 IP 단말 개체 생성
ep = new IPEndPoint(IPAddress.Parse(ip), port);
}
키를 누른 메시지를 전송하는 메서드를 구현합시다.
public void SendKeyDown(int key)
{
이 프로그램에서 키보드와 마우스 이벤트 정보 중에 제일 큰 크기는 마우스 이동 이벤트입니다. 이벤트 종류 1바이트, x좌표 4바이트, y좌표 4바이트로 총 9바이트가 필요합니다.
여기에서는 고정 길이로 보낼 것이어서 9바이트의 버퍼를 생성합니다.
byte[] data = new byte[9];
맨 처음 바이트는 이벤트 종류입니다. 여기에서는 키 누름 이벤트로 설정합니다.
data[0] = (byte)MsgType.MT_KDOWN;//키 누름 이벤트 설정
누른 키를 버퍼에 복사하세요.
Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4);//누른 키를 버퍼에 복사
그리고 버퍼를 전송하세요.
SendData(data);//버퍼 전송
}
이벤트 버퍼를 전송하는 SendData 메서드를 구현합시다.
private void SendData(byte[] data)
{
소켓을 생성하세요.
//소켓 생성
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
원격 제어 호스트와 연결하세요.
sock.Connect(ep);//원격 제어 호스트에 연결
이벤트 버퍼를 전송합니다.
sock.Send(data); //이벤트 전송
전송 후에 소켓을 닫습니다.
sock.Close(); //소켓 닫기
}
이 프로그램에서는 키보드와 마우스 이벤트가 발생할 때마다 원격 제어 호스트의 이벤트 수신 서버에 연결하여 전송하고 닫는 것을 반복할 거예요.
키를 떼었을 때 이벤트를 전송하는 SendKeyUp 메서드를 구현합시다.
public void SendKeyUp(int key)
{
메시지를 보낼 버퍼를 생성하세요.
byte[] data = new byte[9];
키를 뗌 이벤트를 설정하세요.
data[0] = (byte)MsgType.MT_KEYUP;//키 뗌 이벤트 설정
어느 키를 뗀 것인지 버퍼에 복사하세요.
Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4); //뗀 키를 버퍼에 복사
버퍼를 전송합니다.
SendData(data);//버퍼 전송
}
마우스 누름 이벤트를 전송하는 SendMouseDown 메서드를 구현합시다.
public void SendMouseDown(MouseButtons mouseButtons)
{
메시지를 보낼 버퍼를 생성하세요.
byte[] data = new byte[9];
마우스 버튼에 따라 메시지 종류를 결정하세요.
switch (mouseButtons)//마우스 버튼에 따라 메시지 종류 결정
{
case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTDOWN; break;
case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTDOWN; break;
case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEDOWN; break;
}
메시지를 전송합니다.
SendData(data);//마우스 누름 이벤트 전송
}
마우스 뗌 이벤트를 전송하는 SendMouseUp 메서드를 구현합시다.
public void SendMouseUp(MouseButtons mouseButtons)
{
메시지를 보낼 버퍼를 생성하세요.
byte[] data = new byte[9];
마우스 버튼에 따라 메시지 종류를 결정하세요.
switch (mouseButtons) //마우스 버튼에 따라 메시지 종류 결정
{
case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTUP; break;
case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTUP; break;
case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEUP; break;
}
메시지를 전송합니다.
SendData(data);//마우스 뗌 이벤트 전송
}
마우스 이동 이벤트를 전송하는 SendMouseMove 메서드를 구현합시다.
public void SendMouseMove(int x, int y)
{
메시지를 보낼 버퍼를 생성하세요.
byte[] data = new byte[9];
마우스 이동 이벤트를 설정하세요.
data[0] = (byte)MsgType.MT_M_MOVE;//마우스 이동 이벤트 설정
마우스의 x, y 좌표를 복사하세요.
Array.Copy(BitConverter.GetBytes(x), 0, data, 1, 4); //x좌표 복사
Array.Copy(BitConverter.GetBytes(y), 0, data, 5, 4); //y좌표 복사
메시지를 전송합니다.
SendData(data); //마우스 이동 이벤트 전송
}
}
다음은 이번 실습에서 작성한 소스 코드입니다.
//SendEventClient.cs
using System;
using System.Net;
using System.Net.Sockets;
using System.Windows.Forms;
namespace 원격제어기
{
/// <summary>
/// 원격 제어 이벤트 종류 열거형
/// </summary>
public enum MsgType
{
MT_KDOWN = 1, MT_KEYUP, MT_M_LEFTDOWN,
MT_M_LEFTUP, MT_M_RIGHTUP, MT_M_RIGHTDOWN,
MT_M_MIDDLEDOWN, MT_M_MIDDLEUP, MT_M_MOVE
}
/// <summary>
/// 원격 제어 이벤트 전송 클라이언트 클래스
/// </summary>
public class SendEventClient
{
IPEndPoint ep;
/// <summary>
/// 생성자
/// </summary>
/// <param name="ip">원격지 호스트 IP</param>
/// <param name="port">포트</param>
public SendEventClient(string ip, int port)
{
//원격 제어 호스트 IP 단말 개체 생성
ep = new IPEndPoint(IPAddress.Parse(ip), port);
}
/// <summary>
/// 키 누름 이벤트 전송 메서드
/// </summary>
/// <param name="key">누른 키</param>
public void SendKeyDown(int key)
{
byte[] data = new byte[9];
data[0] = (byte)MsgType.MT_KDOWN;//키 누름 이벤트 설정
Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4);//누른 키를 버퍼에 복사
SendData(data);//버퍼 전송
}
private void SendData(byte[] data)
{
//소켓 생성
Socket sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
sock.Connect(ep);//원격 제어 호스트에 연결
sock.Send(data); //이벤트 전송
sock.Close(); //소켓 닫기
}
/// <summary>
/// 키 뗌 이벤트 전송 메서드
/// </summary>
/// <param name="key">뗀 키</param>
public void SendKeyUp(int key)
{
byte[] data = new byte[9];
data[0] = (byte)MsgType.MT_KEYUP;//키 뗌 이벤트 설정
Array.Copy(BitConverter.GetBytes(key), 0, data, 1, 4); //뗀 키를 버퍼에 복사
SendData(data);//버퍼 전송
}
/// <summary>
/// 마우스 누름 이벤트 전송 메서드
/// </summary>
/// <param name="mouseButtons">누른 마우스 버튼</param>
public void SendMouseDown(MouseButtons mouseButtons)
{
byte[] data = new byte[9];
switch (mouseButtons)//마우스 버튼에 따라 메시지 종류 결정
{
case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTDOWN; break;
case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTDOWN; break;
case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEDOWN; break;
}
SendData(data);//마우스 누름 이벤트 전송
}
/// <summary>
/// 마우스 뗌 이벤트 전송 메서드
/// </summary>
/// <param name="mouseButtons">뗀 마우스 버튼</param>
public void SendMouseUp(MouseButtons mouseButtons)
{
byte[] data = new byte[9];
switch (mouseButtons) //마우스 버튼에 따라 메시지 종류 결정
{
case MouseButtons.Left: data[0] = (byte)MsgType.MT_M_LEFTUP; break;
case MouseButtons.Right: data[0] = (byte)MsgType.MT_M_RIGHTUP; break;
case MouseButtons.Middle: data[0] = (byte)MsgType.MT_M_MIDDLEUP; break;
}
SendData(data);//마우스 뗌 이벤트 전송
}
/// <summary>
/// 마우스 이동 메서드
/// </summary>
/// <param name="x">마우스 x좌표</param>
/// <param name="y">마우스 y좌표</param>
public void SendMouseMove(int x, int y)
{
byte[] data = new byte[9];
data[0] = (byte)MsgType.MT_M_MOVE;//마우스 이동 이벤트 설정
Array.Copy(BitConverter.GetBytes(x), 0, data, 1, 4); //x좌표 복사
Array.Copy(BitConverter.GetBytes(y), 0, data, 5, 4); //y좌표 복사
SendData(data); //마우스 이동 이벤트 전송
}
}
}