첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
유용한 소스 코드가 있으면 icodebroker@naver.com으로 보내주시면 감사합니다.
블로그 자료는 자유롭게 사용하세요.

■ 원격 문자 복사하기

----------------------------------------------------------------------------------------------------


TestDotNetRemoting.zip


[TestDotNetRemotingCommon 프로젝트]

 

Cache.cs

 

 

namespace TestDotNetRemotingCommon

{

    /// <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

 

 

namespace TestDotNetRemotingCommon

{

    /// <summary>

    /// 관찰자 인터페이스

    /// </summary>

    public interface IObserver

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

 

        #region 통지하기 - Notify(message)

 

        /// <summary>

        /// 통지하기

        /// </summary>

        /// <param name="message">메시지</param>

        void Notify(string message);

 

        #endregion

    }

}

 

 

RemotableObject.cs

 

 

using System;

 

namespace TestDotNetRemotingCommon

{

    /// <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

    }

}

 

 

[TestDotNetRemotingServer 프로젝트]

 

MainForm.cs

 

 

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using System.Windows.Forms;

 

using TestDotNetRemotingCommon;

 

namespace TestDotNetRemotingServer

{

    /// <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);

 

            TestDotNetRemotingCommon.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

    }

}

 

 

[TestDotNetRemotingClient 프로젝트]

 

MainForm.cs

 

 

using System;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

using System.Windows.Forms;

 

using TestDotNetRemotingCommon;

 

namespace TestDotNetRemotingClient

{

    /// <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

    }

}

 

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요