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; }
'C# with TCP/IP' 카테고리의 다른 글
[Program C#]Client-Server Broadcast 예제 - 콘솔버전 (0) | 2015.02.09 |
---|---|
[Program C#]Binary Serialization 을 이용한 소켓통신 - 윈도우버전 (0) | 2015.01.31 |
[Program C#]구조체를 이용한 소켓통신3 - 바이너리 포매터 방법 - 윈도우 버전 (0) | 2015.01.27 |
[Program C#]구조체를 이용한 소켓통신3 - 바이너리 포매터 방법 - 콘솔 버전 (0) | 2015.01.26 |
[Program C#]구조체를 이용한 소켓통신2 - 마샬링 방법 - 윈도우 버전 (0) | 2015.01.22 |