2008/C#2008. 7. 25. 08:45

다음 예제는 클라이언트가 객체를 서버로 전송후  DB에 넣고,

다시 서버가 DB에서 객체를 읽어서 클라이언트로 보내는 예제입니다


DB에 객체가 삽입될 memo 컬럼은 longtext 타입입니다


CREATE TABLE memo (
  id VARCHAR(8),
  memo LONGTEXT
 );


DB는 mysql을 사용했습니다

DB마다 약간씩 차이가 있더군요

참고하십시오



------------- 서버 -------------

    class Program
    {
        static void Main(string[] args)
        {
            MyConvert mc = new MyConvert();

            Socket m_listenSocket;
            Socket m_clientSocket;
            IPEndPoint m_listenEP;

            MyClass myClass = new MyClass();
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();

            Console.WriteLine("서버 시작");

            m_listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            m_listenEP = new IPEndPoint(IPAddress.Any, 555);

            m_listenSocket.Bind(m_listenEP);
            m_listenSocket.Listen(10);

            m_clientSocket = m_listenSocket.Accept();

           
            // 클라이언트로부터 객체 수신
            int LENGTH = 1024;
            int OFFSET = 0;
            byte[] socket_buffer = new byte[LENGTH];

            while (true)
            {
                int rcvd = m_clientSocket.Receive(socket_buffer, OFFSET, LENGTH, 0);
                Console.WriteLine("메세지 수신 : " + rcvd + "byte");
                if (rcvd > 0)
                {
                    ms.Write(socket_buffer, 0, rcvd);
                }
                if (rcvd < LENGTH)
                {
                    break;
                }
            }

            // 수신된 MemoryStream을 Base64String으로 변환
            string base64EncodedString = mc.MemoryStreamToBase64String(ms);

            // 객체 string을 DB에 삽입
            MySqlConnection con = new MySqlConnection("server = localhost; uid=root; password=1234; database=memojang; pooling=false;");
            MySqlCommand cmd = new MySqlCommand("UPDATE memo SET memo=?paramDATA WHERE id='dalili'", con);
            cmd.Parameters.Add(new MySqlParameter("?paramDATA", MySql.Data.MySqlClient.MySqlDbType.LongText)).Value = base64EncodedString;
           
            cmd.Connection.Open();
            int result = cmd.ExecuteNonQuery();
            Console.WriteLine("result = " + result);

            cmd.Dispose();
            con.Close();

            // DB에서 불러오기
            con = new MySqlConnection("server = localhost; uid=root; password=1234; database=memojang; pooling=false;");
            cmd = new MySqlCommand("SELECT * FROM memo WHERE id='dalili'", con);
            cmd.Connection.Open();
            MySqlDataReader mdr = cmd.ExecuteReader();
            mdr.Read();

            // 객체 string을 byte로 변환
            byte[] buffer2 = mc.Base64StringToByte(mdr.GetString(1));

            // 객체 byte를 클라이언트로 send
            m_clientSocket.Send(buffer2);

            cmd.Dispose();
            con.Close();

            m_listenSocket.Close();
            m_clientSocket.Close();

        }
    }





------------- 클라이언트 -------------


class Program
    {
        static void Main(string[] args)
        {
            MyConvert mc = new MyConvert();

            Console.WriteLine("클라이언트 시작");
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect("localhost", 555);

            MemoryStream ms = new MemoryStream();
            BinaryFormatter binFmtr = new BinaryFormatter();

            MyClass myClass = new MyClass();
            myClass.ID = "test";
            myClass.DATA = "hello world";

            // 객체를 ms로 변환
            ms = mc.ObjectToMemoryStream(myClass);

            int LENGTH = (int)ms.Length;
            int OFFSET = 0;
            byte[] buffer = new byte[LENGTH];

            while (true)
            {
                int rcvd = ms.Read(buffer, OFFSET, LENGTH);
                Console.WriteLine("전송 : " + rcvd + "byte");
                if (rcvd > 0)
                {
                    socket.Send(buffer, 0, rcvd, 0);
                }
                else
                {
                    break;
                }
            }
            Console.WriteLine("전송완료");

            // 서버 로부터 객체 수신
            int LENGTH2 = 1024;
            int OFFSET2 = 0;
            byte[] socket_buffer = new byte[LENGTH2];
           
            ms.Position = 0;  //처음부터 다시 읽기 위해서

            while (true)
            {
                int rcvd = socket.Receive(socket_buffer, OFFSET2, LENGTH2, 0);
                Console.WriteLine("메세지 수신 : " + rcvd + "byte");
                if (rcvd > 0)
                {
                    ms.Write(socket_buffer, 0, rcvd);
                }
                if (rcvd < LENGTH2)
                {
                    break;
                }
            }
            Console.WriteLine("수신완료");

            // ms 스트림을 객체로 변환
            MyClass myClass2 = (MyClass) mc.MemoryStreamToObject(ms);

            Console.WriteLine(myClass2.ID);
            Console.WriteLine(myClass2.DATA);

            ms.Close(); //소멸.
            socket.Close();
        }

Posted by penguindori