블로그 이미지
따시쿵

calendar

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

Notice

2015. 1. 28. 17:05 C# with TCP/IP

프로그램 설명


이번 예제는 Binary Serialization / Deserialization 을 이용한 통신 방법을 설명합니다.


클래스에 property 로 5개 필드(Name, Subject, Grade, Memo, SendTime)를 정의 합니다. SendTime 필드는 전송하는 클라이언트의 전송 시각을 기입하고, 서버에서 메시지를 받아서 네트워크 지연 시간을 확인 해 보기 위한 용도로 추가 했습니다.


3개의 프로젝트가 필요합니다.


1. 공통 라이브러리 

   ==> 클라이언트와 서버에서 사용할 클래스

   ==> 클래스 이름 위에 [Serializable] 특성을 기입하는 게 중요함.

   ==> DataPacket.cs


2. 클라이언트 프로그램


3. 서버 프로그램



실행 후

메시지 전송 후



프로그램 작성 순서


1. 공통 라이브러리 (Common Libray) 

클라이언트와 서버에서 사용할 어셈블리 코드


    [Serializable]
    public class DataPacket
    {
        public string Name { get; set; }
        public string Subject { get; set; }
        public Int32 Grade { get; set; }
        public string Memo { get; set; }
        public DateTime SendTime { get; set; }
    }

 


2. 서버 프로그램


        static void Main(string[] args)
        {
            TcpListener server = null;
            try 
            { 
                server = new TcpListener(IPAddress.Parse("192.168.0.12"), 13000);
                server.Start();

                while (true)
                {
                    Console.WriteLine("Waiting for a connection.....");

                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("\nConnected!!");

                    if (client.GetStream().CanRead)
                    {
                        NetworkStream stream = client.GetStream();
                        IFormatter formatter = new BinaryFormatter();

                        DataPacket packet = new DataPacket();
                        packet = (DataPacket)formatter.Deserialize(stream);

                        string Name = packet.Name;
                        string Subject = packet.Subject;
                        Int32 Grade = packet.Grade;
                        string Memo = packet.Memo;
                        DateTime SendTime = packet.SendTime;

                        TimeSpan time = DateTime.Now - SendTime;
   
                        Console.WriteLine("이 름 : {0}", Name);
                        Console.WriteLine("과 목 : {0}", Subject);
                        Console.WriteLine("점 수 : {0}", Grade);
                        Console.WriteLine("메 모 : {0}", Memo);
                        Console.WriteLine("지연된 시간 : {0}.{1} seconds", time.Seconds.ToString(), time.Milliseconds.ToString());
                        Console.WriteLine("");
                        Console.WriteLine("===========================================");
                        Console.WriteLine("");
                        
                        stream.Close();
                        client.Close();
                    }
                }
            }
            catch (SocketException se)
            {
                Console.WriteLine("SocketException : {0}", se.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception : {0}", ex.Message);
            }
            finally
            {
                server.Stop();
            }
        }

 


3. 클라이언트 프로그램


        static void Main(string[] args)
        {
            try
            {
                string Name = string.Empty;
                string Subject = string.Empty;
                Int32 Grade = 0;
                string Memo = string.Empty;

                do
                {
                    // 1. 데이타 입력
                    Console.Write("이름 : ");
                    Name = Console.ReadLine();

                    Console.Write("과목 : ");
                    Subject = Console.ReadLine();

                    Console.Write("점수 : ");
                    string tmpGrage = Console.ReadLine();
                    if (tmpGrage != "")
                    {
                        int outGrade = 0;
                        if (Int32.TryParse(tmpGrage, out outGrade))
                            Grade = Convert.ToInt32(tmpGrage);
                        else
                            Grade = 0;
                    }
                    else
                        Grade = 0;

                    Console.Write("메모 : ");
                    Memo = Console.ReadLine();

                    if (string.IsNullOrEmpty(Name) || string.IsNullOrEmpty(Subject))
                        break;

                    // 2. 구조체 데이타를 바이트 배열로 변환
                    DataPacket packet = new DataPacket();
                    packet.Name = Name;
                    packet.Subject = Subject;
                    packet.Grade = Grade;
                    packet.Memo = Memo;
                    packet.SendTime = DateTime.Now;
                    Debug.WriteLine("{0} : {1} : {2} : {3} : {4}",
                                        packet.Name, packet.Subject, packet.Grade, packet.Memo, packet.SendTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));

                    // 3. 데이타 전송
                    TcpClient client = new TcpClient("192.168.0.12", 13000);
                    Console.WriteLine("Connected...");

                    NetworkStream stream = client.GetStream();

                    IFormatter formatter = new BinaryFormatter();
                    formatter.Serialize(stream, packet);

                    Console.WriteLine("{0} bytes data sent\n", SizeOf(packet));

                    // 4. 스트림과 소켓 닫기
                    stream.Close();
                    client.Close();
                } while (Name != "" && Subject != "");

            }
            catch (SocketException se)
            {
                Console.WriteLine("SocketException : {0} ", se.Message.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception : {0} ", ex.Message.ToString());
            }

            Console.WriteLine("press the ENTER to continue...");
            Console.ReadLine();
        }

        public static long SizeOf(object obj)
        {
            long size = 0;

            try
            {
                System.IO.MemoryStream stream = new System.IO.MemoryStream();
                BinaryFormatter objFormatter = new BinaryFormatter();
                objFormatter.Serialize(stream, obj);
                size = stream.Length;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception : {0}", ex.Message);
            }

            return size;
        }

 


posted by 따시쿵