■ 원격으로 문자를 복사하는 방법을 보여준다.
[TestLibrary 프로젝트]
▶ Cache.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
namespace TestLibrary { /// <summary> /// 캐시 /// </summary> public class Cache { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 캐시 /// </summary> private static Cache _cache = null; /// <summary> /// 관찰자 /// </summary> private static IObserver _observer; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 부착하기 - Attach(observer) /// <summary> /// 부착하기 /// </summary> /// <param name="observer">관찰자</param> public static void Attach(IObserver observer) { _observer = observer; } #endregion #region 인스턴스 구하기 - GetInstance() /// <summary> /// 인스턴스 구하기 /// </summary> /// <returns>캐시</returns> public static Cache GetInstance() { if(_cache == null) { _cache = new Cache(); } return _cache; } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Public #region 메시지 설정하기 - SetMessage(message) /// <summary> /// 메시지 설정하기 /// </summary> public void SetMessage(string message) { _observer.Notify(message); } #endregion } } |
▶ IObserver.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
namespace TestLibrary { /// <summary> /// 관찰자 인터페이스 /// </summary> public interface IObserver { //////////////////////////////////////////////////////////////////////////////////////////////////// Method #region 통지하기 - Notify(message) /// <summary> /// 통지하기 /// </summary> /// <param name="message">메시지</param> void Notify(string message); #endregion } } |
▶ RemotableObject.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; namespace TestLibrary { /// <summary> /// 원격 객체 /// </summary> public class RemotableObject : MarshalByRefObject { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 메시지 설정하기 - SetMessage(message) /// <summary> /// 메시지 설정하기 /// </summary> /// <param name="message">메시지</param> public void SetMessage(string message) { Cache.GetInstance().SetMessage(message); } #endregion } } |
[TestServer 프로젝트]
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Windows.Forms; using TestLibrary; namespace TestServer { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form, IObserver { //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate ////////////////////////////////////////////////////////////////////////////////////////// Private #region 메시지 설정하기 대리자 - SetMessageDelegate(message) /// <summary> /// 메시지 설정하기 대리자 /// </summary> /// <param name="message">메시지</param> private delegate void SetMessageDelegate(string message); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// TCP 서버 채널 /// </summary> private TcpServerChannel tcpServerChannel = null; /// <summary> /// 메시지 설정하기 대리자 /// </summary> private SetMessageDelegate setMessageDelegate = null; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 통지하기 - Notify(message) /// <summary> /// 통지하기 /// </summary> /// <param name="message">메시지</param> public void Notify(string message) { Invoke(this.setMessageDelegate, message); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 폼 로드시 처리하기 - Form_Load(sender, e) /// <summary> /// 폼 로드시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void Form_Load(object sender, EventArgs e) { this.setMessageDelegate = new SetMessageDelegate(SetMessage); } #endregion #region 시작 버튼 클릭시 처리하기 - startButton_Click(sender, e) /// <summary> /// 시작 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void startButton_Click(object sender, EventArgs e) { this.serverNameTextBox.Enabled = false; this.portTextBox.Enabled = false; this.tcpServerChannel = new TcpServerChannel(Convert.ToInt32(this.portTextBox.Text)); ChannelServices.RegisterChannel(this.tcpServerChannel, true); RemotingConfiguration.RegisterWellKnownServiceType ( typeof(RemotableObject), this.serverNameTextBox.Text, WellKnownObjectMode.Singleton ); TestLibrary.Cache.Attach(this); this.statusToolStripStatusLabel.Text = "상태 : 채널(" + this.tcpServerChannel.ChannelName + "), 수신중..."; } #endregion //////////////////////////////////////////////////////////////////////////////// Function #region 메시지 설정하기 - SetMessage(message) /// <summary> /// 메시지 설정하기 /// </summary> /// <param name="message">메시지</param> private void SetMessage(string message) { this.messageTextBox.Text = message; } #endregion } } |
[TestClient 프로젝트]
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
using System; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Windows.Forms; using TestLibrary; namespace TestClient { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// TCP 클라이언트 채널 /// </summary> private TcpClientChannel tcpClientChannel = null; /// <summary> /// 원격 객체 /// </summary> private RemotableObject remoteObject; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 시작 버튼 클릭시 처리하기 - startButton_Click(sender, e) /// <summary> /// 시작 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void startButton_Click(object sender, EventArgs e) { this.tcpClientChannel = new TcpClientChannel(); ChannelServices.RegisterChannel(this.tcpClientChannel, true); this.remoteObject = Activator.GetObject ( typeof(RemotableObject), "tcp://localhost:" + this.portTextBox.Text + "/" + this.serverNameTextBox.Text + "" ) as RemotableObject; this.serverNameTextBox.Enabled = false; this.portTextBox.Enabled = false; this.statusToolStripStatusLabel.Text = "상태 : 채널(" + this.tcpClientChannel.ChannelName + "), 연결..."; } #endregion #region 메시지 텍스트 박스 텍스트 변경시 처리하기 - messageTextBox_TextChanged(sender, e) /// <summary> /// 메시지 텍스트 박스 텍스트 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void messageTextBox_TextChanged(object sender, EventArgs e) { this.remoteObject.SetMessage(this.messageTextBox.Text); } #endregion } } |