SearchBook.zip



도서 검색 프로그램


네이버 OpenAPI 으로 검색을 요청 해당 XML을 파싱하여 프로그램에 보여줄 수 있게 하였다.

  


Book 클래스는 아래와 같은 디자인으로 되어있다.

  class Book

    {
        public string Bname { get; private set; }
        public string Publisher { get; private set; }
        public string Author { get; private set; }
        public int Price { get; private set; }
        public int DisPrice
        {
            get;
            private set;
        }
        public string Link 
        { 
            get; 
            private set;
        }
        public string Desc { get; private set; }

        public Book(string _bname, string _publisher, string _author, int _price, string _link, string _desc)
        {
            Bname = _bname;   
            Publisher = _publisher;
            Author = _author; 
            Price = _price; 
            Link = _link; 
            Desc = _desc; 
        }

        public override string ToString()
        {
            return this.Bname;
  
    }

위그림을 통해 네이버에서 제공하는 검색api를 사용하여 xml 로 나타난 목록을 확인 할 수 있다. 



BookSearch 클래스

 static class BookSearch

    {
        static ArrayList bl = new ArrayList();

        public static ArrayList Naver(string booksname)
        {
            bl.Clear();
            string bname = null;
            string publisher = null;
            string author = null;
            string link = null;
            int price = 0;
            int disprice = 0;

            string addr = string.Format("http://openapi.naver.com/search?key=??????????????????&query={0}&target=book&display=100&start=1", 
                HttpUtility.UrlEncode(booksname, Encoding.GetEncoding("utf-8")));
            //???????????구간에 해당 사이트에서 발급받은 key값을 넣어준다.
              
            XmlDocument xd = new XmlDocument();
            xd.Load(addr); 

            XmlNode node = xd.SelectSingleNode("rss");  
            XmlNode xnode = node.SelectSingleNode("channel"); 
            XmlNode cnode;
            XmlNodeList xnl = xnode.SelectNodes("item");
            foreach (XmlNode xmlnode in xnl)
            {
                xnode = xmlnode.SelectSingleNode("title");
                bname = ConvertString(xnode.InnerText);
               
                xnode = xmlnode.SelectSingleNode("author");
                author = xnode.InnerText;
               
                xnode = xmlnode.SelectSingleNode("price");
                price = int.Parse(xnode.InnerText);

                xnode = xmlnode.SelectSingleNode("discount");
                try
                {
                    disprice = int.Parse(xnode.InnerText);
                }
                catch
                {
                    disprice = price;
                }

                xnode = xmlnode.SelectSingleNode("publisher");
                publisher = xnode.InnerText;

                cnode = xmlnode.SelectSingleNode("description");
                link = ConvertString(cnode.InnerText);

                cnode = xmlnode.SelectSingleNode("description"); 
                string desc = ConvertString(cnode.InnerText);

                bl.Add(new Book(bname,publisher,author,price,link,desc));                                
            }
            return bl;
        }

        private static string ConvertString(string p)
        {
            int i = 0;
            int j = 0;

            while ((i = p.IndexOf("<")) != -1)
            {
                j = p.IndexOf(">");
                p = p.Remove(i, j - i + 1);
            }
            return p;
        }
    }




'Programing > C#&.Net' 카테고리의 다른 글

D Day 프로그램  (0) 2016.11.30
계산기 예제  (0) 2016.11.30
노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30

DOOmsDay.zip




'Programing > C#&.Net' 카테고리의 다른 글

OpenAPI, XML파싱  (0) 2016.11.30
계산기 예제  (0) 2016.11.30
노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30

calculator.zip


'Programing > C#&.Net' 카테고리의 다른 글

OpenAPI, XML파싱  (0) 2016.11.30
D Day 프로그램  (0) 2016.11.30
노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30

Windows to Android bluetooth Test.zip

블루투스로가버렷.zip




노트북 블루투스와 안드로이드 폰간의 통신



블루투스 통신을 하기 전에 노트북에서 블루투스 장치관리자를 통해 핸드폰 블루투스를 연결해야 한다.

SEV-E160S  내 핸드폰을 연결 한것을 확인 할 수 있다. (갤럭시 노트1 , 안드로이드 4.1.2)



노트북에서 블루투스통신을 하기 위해 c#으로 프로그램을 만들었다.



핵심은 InTheHand.Net.Personal.dll 이다. 이 DLL에서 제공해주는 라이브러리를 사용하여 블루투스 연결을 하였다.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using InTheHand.Net.Sockets;
using InTheHand.Net.Bluetooth;
using InTheHand.Windows.Forms;
using InTheHand.Net.Bluetooth.AttributeIds;
using System.IO;

namespace Bluetooth_ServerSide
{
    public partial class Form1 : Form
    {
        // Threads
        Thread AcceptAndListeningThread;

        // helper variable
        Boolean isConnected = false;
        
        //bluetooth stuff
        BluetoothClient btClient;  //represent the bluetooth client connection
        BluetoothListener btListener; //represent this server bluetooth device

        public Form1()
        {

            InitializeComponent();


            //when the bluetooth is supported by this computer

            if (BluetoothRadio.IsSupported)
            {

                UpdateLogText("Bluetooth Supported!");
                UpdateLogText("—————————–");
                
                //getting device information
                UpdateLogText("Primary Bluetooth Radio Name : " + BluetoothRadio.PrimaryRadio.Name);
                UpdateLogText("Primary Bluetooth Radio Address : " + BluetoothRadio.PrimaryRadio.LocalAddress);
                UpdateLogText("Primary Bluetooth Radio Manufacturer : " + BluetoothRadio.PrimaryRadio.Manufacturer);
                UpdateLogText("Primary Bluetooth Radio Mode : " + BluetoothRadio.PrimaryRadio.Mode);
                UpdateLogText("Primary Bluetooth Radio Software Manufacturer : " + BluetoothRadio.PrimaryRadio.SoftwareManufacturer);
                UpdateLogText("—————————–");

                //creating and starting the thread
                AcceptAndListeningThread = new Thread(AcceptAndListen);

                AcceptAndListeningThread.Start();

            }
            else
            {
                UpdateLogText("Bluetooth not Supported!");
            }
        }
        StreamReader srReceiver;
        private delegate void UpdateLogCallback(string strMessage);

        private void ReceiveMessages()
        {
            // Receive the response from the server
            srReceiver = new StreamReader(btClient.GetStream());

            // If the first character of the response is 1, connection was successful
            string ConResponse = srReceiver.ReadLine();

            // If the first character is a 1, connection was successful
            if (ConResponse[0] == '1')
            {
                // Update the form to tell it we are now connected
                this.Invoke(new UpdateLogCallback(this.UpdateLogText), new object[] { "Connected Successfully!" });
            }
            else // If the first character is not a 1 (probably a 0), the connection was unsuccessful
            {
                string Reason = "Not Connected: ";

                // Extract the reason out of the response message. The reason starts at the 3rd character
                Reason += ConResponse.Substring(2, ConResponse.Length - 2);

                // Exit the method
                return;
            }
            // While we are successfully connected, read incoming lines from the server
            while (isConnected)
            {
                // Show the messages in the log TextBox
                this.Invoke(new UpdateLogCallback(this.UpdateLogText), new object[] { srReceiver.ReadLine() });
            }
        }

        //the function of the thread
        public void AcceptAndListen()
        {
            while (true)
            {
                if (isConnected)
                {
                    //TODO: if there is a device connected
                    //listening
                    try
                    {
                        UpdateLogTextFromThread("Listening….");
                        NetworkStream stream = btClient.GetStream();

                        Byte[] bytes = new Byte[512];

                        String retrievedMsg = "";

                        stream.Read(bytes, 0, 512);

                        stream.Flush();

                        for (int i = 0; i < bytes.Length; i++)
                        {
                            retrievedMsg += Convert.ToChar(bytes[i]);

                        }

                        UpdateLogTextFromThread(btClient.RemoteMachineName + " : " + retrievedMsg);
                        UpdateLogTextFromThread("");

                        if (!retrievedMsg.Contains("servercheck"))
                        {

                            sendMessage("Message Received!");
                        }
                        ReceiveMessages();
                    }
                    catch (Exception ex)
                    {
                        UpdateLogTextFromThread("There is an error while listening connection");
                        UpdateLogTextFromThread(ex.Message);
                        isConnected = btClient.Connected;
                    }
                }
                else
                {
                    //TODO: if there is no connection
                    // accepting
                    try
                    {
                        btListener = new BluetoothListener(BluetoothService.RFCommProtocol);
                        
                        UpdateLogTextFromThread("Listener created with TCP Protocol service " + BluetoothService.RFCommProtocol);
                        UpdateLogTextFromThread("Starting Listener….");
                        btListener.Start();
                        UpdateLogTextFromThread("Listener Started!");
                        UpdateLogTextFromThread("Accepting incoming connection….");
                        btClient = btListener.AcceptBluetoothClient();
                        isConnected = btClient.Connected;
                        UpdateLogTextFromThread("A Bluetooth Device Connected!");
                    }
                    catch (Exception e)
                    {
                        UpdateLogTextFromThread("There is an error while accepting connection");
                        UpdateLogTextFromThread(e.Message);
                        UpdateLogTextFromThread("Retrying….");
                    }
                }
            }
        }
        //this section is to create a method that allow thread accessing form’s component
        //we can’t update the text of the textbox directly from thread, so, we use this delegate function
        
        delegate void UpdateLogTextFromThreadDelegate(String msg);
        public void UpdateLogTextFromThread(String msg)
        {
            if (!this.IsDisposed && logsText.InvokeRequired) 
            {
                logsText.Invoke(new UpdateLogTextFromThreadDelegate(UpdateLogText), new Object[]{msg});
            }
        }
        //just ordinary function to update the log text.
        //after updating, we move the cursor to the end of text and scroll it to the cursor.
        public void UpdateLogText(String msg)
        {
            logsText.Text += msg + Environment.NewLine;
            logsText.SelectionStart = logsText.Text.Length;
            logsText.ScrollToCaret();
        }
        //function to send message to the client
        public Boolean sendMessage(String msg) 
        {
            try
            {
                if (!msg.Equals(""))
                {
                    UTF8Encoding encoder = new UTF8Encoding();
                    NetworkStream stream = btClient.GetStream();
                    stream.Write(encoder.GetBytes(msg + "\n"), 0, encoder.GetBytes(msg).Length);
                    stream.Flush();
                    
                }
            }
            catch (Exception ex)
            {
                UpdateLogTextFromThread("There is an error while sending message");
                UpdateLogTextFromThread(ex.Message);
                try
                {
                    isConnected = btClient.Connected;
                    btClient.GetStream().Close();
                    btClient.Dispose();
                    btListener.Server.Dispose();
                    btListener.Stop();
                }
                catch (Exception)
                {
                }
            
                return false;
            }
            
            return true;
        }
        //when closing or exiting application, we have to close connection and aborting the thread.
        //Otherwise, the process of the thread still running in the background.
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            try
            {
                AcceptAndListeningThread.Abort();
                btClient.GetStream().Close();
                btClient.Dispose();
                btListener.Stop();
                FormClosed += new FormClosedEventHandler(Form1_FormClosed);
            }
            catch (Exception)
            {
            }
        }

        void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Close();
        }
        private void sendBtn_Click(object sender, EventArgs e)
        {
            sendMessage(messageText.Text);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            sendMessage(messageText.Text);
            sendMessage(textBox1.Text);

            messageText.Clear();
            textBox1.Clear();
        }
    }
}


전체적인 구조는 기본적인 통신 구조와 같다. 

윈도우 프로그램은 서버 역활을 하며 접속을 기다린다.


안드로이드 프로그램은 오픈소스인 BluetoothChat을 사용하였으며,

여기서 UUID의 변경이 필요하다. 핸드폰과 핸드폰간의 블루투스 통신과

노트북과 핸드폰 간의 통신에서는 다른 UUID를 사용하기 때문이다.



핸드폰에서 메뉴를 선택하면 커넥할 드라이브를 찾을 수 있도록 되어 있다.

해당 드라이버를 찾아 연결하게 된다.





연결이 되면 서버에서 확인이되며 폰에서도 확인이 가능하다.






드로에서 연결을 종료하게 되면 위와 같은 메시지가 나오며 다시 접속을 기다리게된다.







블루투스 통신을 해본 결과, 절차를 지키는 것이 굉장히 중요하며 연속적인 연결과 접속 해제를 할 경우 
정상적으로 접속되지 않는 경우가 많이 발생하게 된다. 

소스파일첨부







블루투스 통신을 통한 채팅 테스트 영상





블루투스 통신을 통한 화면 제어 테스트 영상





'Programing > C#&.Net' 카테고리의 다른 글

D Day 프로그램  (0) 2016.11.30
계산기 예제  (0) 2016.11.30
speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30
.NET 리모팅  (0) 2016.11.30

Interop.SpeechLib.dll




본 프로젝트에서 사용될 음성인식 부분이다.

-음성인식은 Speach엔진을 사용하였으며, Speach엔진을 사용하는 방법이다.

-DLL로 구성하였다.

-참조된 SpeachDLL을 포함하고 있어야한다.

-MS에서 재공하는 SpeechSDK51.exe 를 다운받아야 사용할 수 있다.


public class Speach

    {

        SpeechLib.SpSharedRecoContext objRecoContext = null;

        SpeechLib.ISpeechRecoGrammar grammar = null;

        SpeechLib.ISpeechGrammarRule menuRule = null;

        public event SpeachResultReturn SpeachResultReturnEventHandler = null;

        public string result = string.Empty;

        public string Result

        {

            get

            {

                return result;

            }

        }

        public void StartSpeach()

        {

            objRecoContext = new SpeechLib.SpSharedRecoContext();

            objRecoContext.Hypothesis += new _ISpeechRecoContextEvents_HypothesisEventHandler(objRecoContext_Hypothesis);

 

            objRecoContext.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(objRecoContext_Recognition);

           

            grammar = objRecoContext.CreateGrammar(0);

            menuRule = grammar.Rules.Add("MenuCommands"SpeechRuleAttributes.SRATopLevel | SpeechRuleAttributes.SRADynamic, 1);

            object PropValue = "";

 

            menuRule.InitialState.AddWordTransition(null"End"" "SpeechGrammarWordType.SGLexical, "End"1ref PropValue, 1.0F);

            menuRule.InitialState.AddWordTransition(null"Start"" "SpeechGrammarWordType.SGLexical,"Start"2ref PropValue, 1.0F);

            menuRule.InitialState.AddWordTransition(null"Aircon"" "SpeechGrammarWordType.SGLexical,"Aircon"3ref PropValue, 1.0F);

            menuRule.InitialState.AddWordTransition(null"Audio"" "SpeechGrammarWordType.SGLexical,"Audio"4ref PropValue, 1.0F);

            menuRule.InitialState.AddWordTransition(null"Option"" "SpeechGrammarWordType.SGLexical,"Option"4ref PropValue, 1.0F);

 

            grammar.Rules.Commit();

            grammar.CmdSetRuleState("MenuCommands"SpeechRuleState.SGDSActive);

        }

 

        void objRecoContext_Recognition(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result)

        {

            string txtReco = string.Empty;

            txtReco = Result.PhraseInfo.GetText(0, -1true);

            switch (txtReco)

            {

                case "End": result = "End"break;

                case "Start": result = "Start"break;

                case "Aircon": result = "Aircon"break;

                case "Audio": result = "Audio"break;

                case "Option": result = "Option"break;

            }

            if (txtReco != null)

            {

                if (SpeachResultReturnEventHandler != null)

                {

                    SpeachResultReturnEventHandler();

                }

            }

        }

 

        void objRecoContext_Hypothesis(int StreamNumber, object StreamPosition, ISpeechRecoResult Result)

        {

            string txtHyp = string.Empty;

            txtHyp = Result.PhraseInfo.GetText(0, -1true);           

        }

    }


 

-사용법

-WinFrom 응용프로그램 이용하여 Test프로그램을 만들어 보았다.

public partial class Form1 : Form

    {

        SpeachDll.Speach myspeach = new SpeachDll.Speach();

        public Form1()

        {

            InitializeComponent();          

        }

 

        private void button1_Click(object sender, EventArgs e)

        { 

            myspeach.StartSpeach();

            myspeach.SpeachResultReturnEventHandler += new SpeachDll.SpeachResultReturn(myspeach_SpeachResultReturnEventHandler);

        }

 

        void myspeach_SpeachResultReturnEventHandler()

        {

            MessageBox.Show(myspeach.Result);

        }

    }


'Programing > C#&.Net' 카테고리의 다른 글

계산기 예제  (0) 2016.11.30
노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30
.NET 리모팅  (0) 2016.11.30
직렬화(Serializable) 예제  (0) 2016.11.30

종료시 해당 파일을 저장하기 위한 코드

  private void MainForm_FormClosed(object sender, FormClosedEventArgs e)

        {
            gd = GlobalData.GetInstance();
            string path = string.Format(@"{0}\cozy.txt", GlobalData.ProgramDir);
            FileStream fs = new FileStream(path, FileMode.Create);           
            BinaryFormatter bf = new BinaryFormatter();            
            bf.Serialize(fs, gd);
            fs.Close();
        } 


폼 시작시 저장된 파일을 불러오기 위한 코드

  private void MainForm_Load(object sender, EventArgs e)

        {
            GlobalData gd2 = GlobalData.GetInstance();
            if (File.Exists("cozy.txt"))
            {
                FileStream fs = File.OpenRead("cozy.txt");
                BinaryFormatter bf = new BinaryFormatter();
                gd2 = bf.Deserialize(fs) as GlobalData;
              
                gd.MemList = gd2.MemList;
                for (int i = 0; i < gd.GetList().Count; i++)
                {
                    listView1.Items.Add(gd.GetList()[i].Name);
                    listView1.Items[i].SubItems.Add(gd.GetList()[i].Id);
                }
                fs.Close();
            }
        }



사진 업로드를 위한코드

  private void button3_Click(object sender, EventArgs e)

        {
            //OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "Bmp File(*.bmp,*.jpg)|*.bmp;*.jpg";

            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                GlobalData global = GlobalData.GetInstance();                
               if (!global.IsExist(textName.Text))
               {
                   Bitmap bmp = new Bitmap(Image.FromFile(openFileDialog1.FileName));
                   //bmp.Save(string.Format(@"{0}\{1}.bmp", GlobalData.MembersDir, textName.Text));
                   pictureBox1.Image = bmp;
                   textAddFile.Text = openFileDialog1.FileName;
               }
            }          
        }



사진을 불러오기 위한 코드(회원 추가 버튼이 발생했을때 수행)

                  if (AddMemberEventHandler != null)

            {
                DateTime dt;
                id = textID.Text;
                pw = textPW.Text;
                name = textName.Text;
                age = int.Parse(textAge.Text);
    
                dt = dateTimePicker1.Value;
                
                AddMemberEventHandler(id, pw, name, age,dt);
               
                Bitmap bmp = new Bitmap(Image.FromFile(openFileDialog1.FileName));
                bmp.Save(string.Format(@"{0}\{1},{2}.bmp", GlobalData.MembersDir, textName.Text,i));
                i++;
                this.Close();
                NullChangeEventHandler();                
            }



회원추가 및 메인화면


회원이름을 더블클릭 하였을때 회원정보 출력


저장된 파일과 사진정보



'Programing > C#&.Net' 카테고리의 다른 글

노트북 블루투스 + 안드로이드 폰 연동  (0) 2016.11.30
speech To Text  (0) 2016.11.30
.NET 리모팅  (0) 2016.11.30
직렬화(Serializable) 예제  (0) 2016.11.30
명시적 어셈블리 로딩  (0) 2016.11.30

.NET 리모팅

.NET 리모팅(.NET Remoting)은 서로 다른 프로세스 영역, 혹은 서로 다른 호스타에 존재하는 모듈간에 정보 교환을 손쉽게 할 수 있는 방법 입니다. 

.NET에서 제공하는 리모팅은 DCOM이나 CORBA의 한계를 극복하고자 나온 것 이라고 할 수 있습니다. 웹 서비스 역시 내부적으로는 리모팅을 사용하고 있으며 사실상 리모팅을 손쉽게 사용할 수 있는 일종의 껍데기에 불과합니다.


.NET 리모팅의 동작 원리

개발자가 기본적으로 작성해야 하는 부분은 서버 객체, 호스팅 어플리케이션, 그리고 클라이언트 어플리케이션 입니다. 수행하고자 하는 서버 작업은 서버 객체가 처리하며, 말 그대로 객체이기 때문에 클라이언트로의 요청을 받아 객체의 생성과 소멸을 처리해주는 대리인이 필요합니다. 이 대리인을 어플리케이션에게 특정 객체를 사용하겠다는 요청을 하면 호스팅 어플리케이션은 먼저 그 객체를 자기가 관리하고 있는지 체크하고 객체를 생성하여 클라이언트와 연결시켜 줍니다. 


원격객체(Remote Object)

리모팅이 나오게 된 가장 큰 목적 중의 하나는 원격 객체의 메서드를 호출하고 결과값을 전달받아 복잡한 과정을 개발자에게 숨기고 단순한 인터페이스를 제공하기 위함입니다. 여기서 원격 객체라 함은 클라이언트와 다른 어플리케이션 도메인에 객체가 존재한다는 의미 입니다.

클라이언트에 객체를 전달하는 방식에는 객체에 대한 참조값만 넘기는 방법과 객체 자체를 넘기는 방법이 있는데, 객체와 클라이언트가 같은 어플리케이션 도메인에 있느냐 아니냐에 따라 어떤 방법을 쓸 것인지가 결정됩니다. 객체와 클라이언트가 같은 어플리 케이션 도메인에 있는 경우에는 객체에 대한 참조값만을 넘김으로써 클라이언트가 그 객체를 사용할 수 있으나, 서로 다른 어플리케이션 도메인에 존재하는 경우에는 반드시 객체 자체를 클라이언트로 전달해야 합니다.

이 때 .NET 프레임워크는 객체를 시리얼라이즈(Serialize)하여 클라이언트에게 전달하고 클라이언트는 그 데이터를 사용하여 객체를 생성합니다. 로컬객체를 시리얼라이즈하기 위해서는 [serializable]이라는 성송을 부여하는데, 이 속성이 지정되지 않았거나 인터페이스가 구현되지 않은 객체는 시리얼라이즈가 되지 않기 때문에 원격 객체로 사용할 수 없습니다.

.NET에서는 객체를 MarshalByRefObject로부터 상속시킴으로써 원격 객체를 생성할 수 있는데, 이 때클라이언트는 이 객체에 대한 프록시를 사용하게됩니다. 프록시와 원격 객체가 같은 어플리케이션 도메인에 있으면 프록시는 원격 객체의 메서드를 직접 호출하고 결과를 받아 클라이언트에게 돌려줍니다. 만약 프록시와 원격 객체가 별개의 어플리케이션 도메인에 존재한다면 프록시는 클라이언트의 요청을 메시지로 변환하여 원격 객체에게 전송합니다. 원격 객체쪽에서는 메시지를 자신이 이해할 수 있는 방식으로 변환한 후 클라이언트의 요청을 수행하고 결과값을 다시 메시지로 바꾸어 프록시에게 보냅니다. 프록시는 이 메시지로 부터 결과값을 얻어내어 클라이언트에게 넘겨줍니다.


프록시 객체

클라이언트가 원격 객체를 사용하고자 할 때 프록시가 생성됩니다. 프록시는 TransparentProxy와 RealProxy로 나뉘는데 클라이언트가 사용하는 것은 TransparentProxy이다. 원격 객체와 TransparentProxy가 같은 어플리케이션 도메인에 있으면 TransparentProxy는 원격 객체에 직접 접근하여 메서드를 호출한다. 만약 원격 객체와 TransparentProxy가 서로 다른 어플리케이션 도메인에 있으면 TransparentProxy는 클라이언트가 호출한 메서드의 매개변수를 메시지로 변환하여 RealProxy에게 전송한다. RealProxy는 원격 객체에 접근하여 매개변수가 담긴 메시지를 넘겨주며 메서드의 결과값은 RealProxy와 TransparentProxy를 거쳐 클라이언트가 받게 된다. 

클라이언트가 TransparentProxy에 대해 메서드를 호출하면 그정보는 메시지로 변환되여 RealProxy로 전달되고, RealProxy는 메시지를 포맷터 싱크에 넘긴다.(formatter sink) 포맷터 싱크는 하나 이상의 포매터가 파이프처럼 연결된 형태이며, 메시지를 바이너리 스트림 혹은 XML 스트림으로 변환해서 트랜스포트 싱크(transport sink)에 전닳나다. 트랜스포트 싱크 역시 하나 이상의 트랜스포트 포맷터로 구성되어 있는 형태이며 서버측의 트랜스포트 싱크와 연결하여 데이터를 전송하고, 서버측의 트랜스포트 싱크는 시리얼라이즈되어 전달된 데이터를 포맷터 싱크로 전달한다. 포맷터 싱크는 데이터 스트림을 원격 객체가 사용할 수 있는 데이터로 복원하여 원격 객체에게 전달한다. 결과값 전송은 이와 반대 순서로 진행된다.


활성화와 프록시 객체의 개요

· 원객 객체 활성화 방법

   ° 서버 활성화 객체(SAO : Server Activated Object)

      · SingleCall 방식 - 함수 호출 요청이 있을 때마다 객체 생성

      · Singleton 방식 - 클라이언트 함수 호출 요청이 있을 때 하나의 객체를 생성한 후 하나의 객체를 공유

   ° 클라이언트 활성화 객체(CAO : Client Activated Object)

· 서버 활성화와 클러이언트 활성화

   ° 서버에 의해서 원격 객체가 자동으로 만들어지면 서버 활성화 기법이라고 한다.

   ° 클라이언트에서 프록시 객체를 만들 때 원격 객체가 만들어지면 클라이언트 호라성화 기법이라고 한다.

·클라이언트의 프록시

   ° 클라이언트에서는 원격 객체를 참조하기 위한 가상의 객체를 만들게 되는데 이 객체를 프록시 객체라고 한다.

   ° 이 프록시 객체를 이용해서 클라이언트는 원격 객체를 핸들링 할 수 있다.

· 프록시 객체를 생성하는 방법

   ° new를 사용하는 방법 : 서버 활성화, 클라이언트 활성화에서 사용

   ° Activator.GetObject() 함수를 사용하는 방법 : 서버 활성화에서 사용

   ° Activator.CreateInstance() 함수를 사용하는 방법 : 클라이언트 활성화에 사용

'Programing > C#&.Net' 카테고리의 다른 글

speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30
직렬화(Serializable) 예제  (0) 2016.11.30
명시적 어셈블리 로딩  (0) 2016.11.30
인덱서(Indexer) 예제  (0) 2016.11.30


AboutSerialize.zip



직렬화(Serializable)


개체의 상태 데이터를 일정한 위치(메모리,물리적 파일 등) 에 선형적인방법으로 지속시키는 것을 말한다.

BinaryFormatter를 이용한 직렬화와 SoapFormatter를 사용한 직렬화로 2가지가있다.


바이너리 직렬화(BinaryFormatter 사용)


바이너리 직렬화는, 타입이 원래 객체의 타입과 똑같도록 보존해 줍니다. 객체의 상태를 다른 응용프로그램 호출 사이에

보존하고자 할 때 유용합니다. Binary라는 용어가 저장매체에 저장되어 있는 객체와 동일한 복사본을 생성하는데 필요한

필수적인 정보라는 뜻을 가지고 있습니다. 


SOAP 직렬화


SOAP 프로토콜은 서로 다른 아키텍쳐를 가지는 어플리케이션 간의 통신에 이상적입니다. .NET에서 SOAP Serialization을 이용하면

어플리케이션이 System.Runtime.Serialization.Formatter.Soap을 참조해야 합니다. SOAP 직렬화의 기본적인 장점은 

이식성 입니다. SoapFormatter는 객체를 직렬화해서 SOAP 메시지로 바꾸거나, SOAP 메시지로를 파싱해서 직렬화된 객체를 추출해 냅니다.



바이너리 형식으로 저장된 정보 






직열화 예제 코드


Main Class

 using System.Runtime.Serialization.Formatters.Binary; 


namespace AboutSerialize 

    class Program 
    { 
        static void Main(string[] args) 
        { 
            School school = new School(); 
            Console.WriteLine("Serialize 이전"); 
            Stu s1 = new Stu(1"a1"); 
            school.AddStu(s1); 
            Stu s2 = new Stu(2"a2"); 
            school.AddStu(s2); 
            Stu s3 = new Stu(3"a3"); 
            school.AddStu(s3); 
            Stu s4 = new Stu(4"a4"); 
            school.AddStu(s4); 
            Stu s5 = new Stu(5"a5"); 
            school.AddStu(s5); 
            school.AllView(); 

            FileStream fs = new FileStream(@"cozy.txt", FileMode.Create); 
            BinaryFormatter bf = new BinaryFormatter(); 

            bf.Serialize(fs, school); 
            fs.Close(); 

            Console.WriteLine("DeSerialize 한 개체"); 
            fs = new FileStream(@"cozy.txt", FileMode.Open); 
            School school2 = bf.Deserialize(fs) as School; 
            school2.AllView(); 
            fs.Close(); 
        } 
    } 
}


Stu Class

 namespace AboutSerialize 


    [Serializable] 
    class Stu 
    { 
        int num; 
        string name; 
        public Stu(int _num, string _name) 
        { 
            num = _num; 
            name = _name; 
        } 
        public override string ToString() 
        { 
            return "이름은 : " + name + " 번호 : " + num; 
        } 
    } 
}


School Class

 namespace AboutSerialize 


    [Serializable] 
    class School 
    { 
        List<Stu> list = new List<Stu>(); 
        public void AllView() 
        { 
            foreach (Stu s in list) 
            { 
                Console.WriteLine(s.ToString()) ; 
            } 
        } 
        public void AddStu(Stu s) 
        { 
            list.Add(s); 
        } 
    } 
}


'Programing > C#&.Net' 카테고리의 다른 글

회원관리 연습  (0) 2016.11.30
.NET 리모팅  (0) 2016.11.30
명시적 어셈블리 로딩  (0) 2016.11.30
인덱서(Indexer) 예제  (0) 2016.11.30
Delegate(대리자) 프로그램  (0) 2016.11.30


Stu클래스를 클래스 라이브러리로 생성하고 해당 테스트 클래스 디버그 파일이 있는 곳에 복사해 두었다.    


using System; 

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Student 

    public class Stu 
    { 
        int num; 
        string name; 
        public Stu(int _num, string _name) 
        { 
            num = _num; 
            name = _name; 
        } 
        public void Study() 
        { 
            Console.WriteLine("{0}학생 공부중입니다.", name); 
        } 
        public override string ToString() 
        { 
            return "이름 : " + name + "  번호 :" + num; 
        } 
    } 



테스트 클래스이다.

dll을 직접 등록하지 않고 명시적으로 등록하여 Stu에 있는 Study 함수를 호출하는 예제이다.

using System; 

using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace 명시적어셈블리로딩 

    class Program 
    { 
        static void Main(string[] args) 
        { 
            Assembly asm = Assembly.Load("Student"); 
            Type type = asm.GetType("Student.Stu"); 
            Object o = Activator.CreateInstance(type,1,"홍길동"); 
            MethodInfo mi = type.GetMethod("Study"); 
            mi.Invoke(o, null); 
        } 
    } 
}


'Programing > C#&.Net' 카테고리의 다른 글

.NET 리모팅  (0) 2016.11.30
직렬화(Serializable) 예제  (0) 2016.11.30
인덱서(Indexer) 예제  (0) 2016.11.30
Delegate(대리자) 프로그램  (0) 2016.11.30
리플렉션 활용  (0) 2016.11.30


Indexer.zip



인덱서 사용예제


해당 클래스의 인덱서를 정의하여 사용하였다 string 값을 입력받아 Stu 클래스의 num 값을 반환한다.


Main class

  1 namespace Indexer

  2 {
  3     class Program
  4     {
  5         static void Main(string[] args)
  6         {
  7             Manager m = new Manager();
  8             Stu s = new Stu(1, "홍길동");
  9             Stu s1 = new Stu(2, "후후훗");
 10             Stu s2 = new Stu(3, "히히힛");
 11             m.AddStu(s);
 12             m.AddStu(s1);
 13             m.AddStu(s2);
 14             int num,num1,num2;
 15             num = m["홍길동"];
 16             num1 = m["후후훗"];
 17             num2 = m["히히힛"];
 18             Console.WriteLine("{0},{1},{2}",num, num1, num2);
 19         }
 20     }
 21 }


Stu class

  1 using System;

  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace Indexer
  7 {
  8     class Stu
  9     {
 10         int num;
 11         string name;
 12         List<Stu> arr = new List<Stu>();
 13         public Stu(int _num, string _name)
 14         {
 15             num = _num;
 16             name = _name;
 17         }
 18         public int Num
 19         {
 20             get
 21             {
 22                 return num;
 23             }
 24         }
 25         public string Name
 26         {
 27             get
 28             {
 29                 return name;
 30             }
 31         }
 32     }
 33 }
 34 


Manager class

  1 using System;

  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 
  6 namespace Indexer
  7 {
  8     class Manager
  9     {
 10         List<Stu> arr = new List<Stu>();
 11 
 12         public void AddStu(Stu a)
 13         {
 14             arr.Add(a);
 15         }
 16         public int this[string n] // 반환형 데이터 타입int 입력을 string n 
 17         {
 18             get
 19             {
 20                 foreach (Stu stu in arr) // 받아온 값을 비교하여 리턴해준다.
 21                 {
 22                     if (stu.Name == n)
 23                     {
 24                         return stu.Num;
 25                     }                    
 26                 }
 27                 return 0;
 28             }
 29         }
 30     }
 31 }
 32 


'Programing > C#&.Net' 카테고리의 다른 글

직렬화(Serializable) 예제  (0) 2016.11.30
명시적 어셈블리 로딩  (0) 2016.11.30
Delegate(대리자) 프로그램  (0) 2016.11.30
리플렉션 활용  (0) 2016.11.30
리플렉션(reflection)  (0) 2016.11.30

+ Recent posts