다음 예제는 클라이언트가 객체를 서버로 전송후 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(); } |