2014. 12. 23. 11:52
C# with TCP/IP
프로그램 설명
msdn 사이트에 있는 예제를 조금 수정해서 작성했습니다.
원본 소스는 아래와 같습니다.
동기 서버 예제 : http://msdn.microsoft.com/ko-kr/library/6y0e13d3(v=vs.110).aspx
동기 클라이언트 예제 : http://msdn.microsoft.com/ko-kr/library/kb5kfec7(v=vs.110).aspx
수정한 부분은 로컬 아이피를 가져오는 method 추가와 문자열 자르기 method(TruncateLeft), 클라이언트가 서버로 전송하는 메시지를 콘솔에서 입력 받아서 서버로 전송하는 부분입니다.
클라이언트에서 서버로 전송하는 문자열의 마지막에 <EOF>을 문자열을 추가해서 전송합니다.
데모로 나와 있는 소스는 클라이언트가 메시지를 한 번 전송하고, 에코 메시지를 받는 것이 전부입니다. 계속 메시지를 전송할 수 있는 것이 아닙니다.
예제에서는 클라이언트 3개를 띄워서 테스트를 해 봤습니다.
실행 후
메시지 전송 후
프로그램 작성 순서
1. 소켓/쓰레드과 관련한 네임스페이스를 서버/클라이언트 모두에 포함 시킵니다.
using System.Net; using System.Net.Sockets; using System.Threading;
2. 서버 프로그램
// Incoming data from the client public static string data = null; public static string TruncateLeft(string value, int maxLength) { if (string.IsNullOrEmpty(value)) return value; return value.Length <= maxLength ? value : value.Substring(0, maxLength); } public static string LocalIPAddress() { IPHostEntry host; string localIP = ""; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { localIP = ip.ToString(); break; } } return localIP; } public static void StartListening() { Socket listener = null; Socket handler = null; // Data buffer from incoming data byte[] bytes = new byte[1024]; // Establish the local endpoint for the socket // Dns.GetHostName returns the name of the // host running the application IPAddress localIPAddress = IPAddress.Parse(LocalIPAddress()); IPEndPoint localEndPoint = new IPEndPoint(localIPAddress, 11000); // Create a TCP/IP Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Bind the socket to the local endpoint and // listen for incoming connections. try{ listener.Bind(localEndPoint); listener.Listen(10); // Start listening for connections. while(true) { Console.WriteLine("Waiting for connections....."); // Program is suspended while waiting for an incoming connection. handler = listener.Accept(); data = null; // An incoming connection needs to be processed. while(true) { bytes = new byte[1024]; int bytesRec = handler.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); if (data.IndexOf("<eof>") > -1) break; } // Truncate the <EOF> data = TruncateLeft(data, data.Length - 5); // Show the data on the console Console.WriteLine("Text received : {0}", data); // Echo the data back to the client data = "[Server Echo 메시지]" + data; byte[] msg = Encoding.UTF8.GetBytes(data); handler.Send(msg); handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch (SocketException se) { Console.WriteLine("Socket 에러 : {0}", se.ToString()); switch(se.SocketErrorCode) { case SocketError.ConnectionAborted: case SocketError.ConnectionReset: handler.Close(); break; } } catch(Exception e) { Console.WriteLine(e.ToString()); } } static void Main(string[] args) { StartListening(); Console.ReadLine(); }
2. 클라이언트 프로그램
public static string LocalIPAddress() { IPHostEntry host; string localIP = ""; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress ip in host.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { localIP = ip.ToString(); break; } } return localIP; } private static void StartClient() { // Data buffer fr incomming data byte[] bytes = new byte[1024]; // Connect to a remote device try { // Establish the remote endpoint for the socket. // This example uses port 11000 on the local computer. IPAddress remoteIPAddress = IPAddress.Parse(LocalIPAddress()); IPEndPoint remoteEndPoint = new IPEndPoint(remoteIPAddress, 11000); // Create a TCP/IP Socket Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Connect the socket to the remote endpoint Catch any errors. try { sender.Connect(remoteEndPoint); Console.WriteLine("Socket connected to {0}", sender.RemoteEndPoint.ToString()); // Encoding the data string into a byte array. Console.Write("Client 메시지 :"); byte[] msg = Encoding.UTF8.GetBytes(Console.ReadLine()); // Send the data through the socket. int bytesSent = sender.Send(msg); // Receive the response from the remote device int bytesRec = sender.Receive(bytes); Console.WriteLine("Echoed test = {0}", Encoding.UTF8.GetString(bytes, 0, bytesRec)); // Release the socket. sender.Shutdown(SocketShutdown.Both); sender.Close(); } catch(ArgumentNullException ane) { Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); } catch(SocketException se) { Console.WriteLine("SocketException : {0}", se.ToString()); } catch(Exception e) { Console.WriteLine("Unexpected exception : {0}", e.ToString()); } } catch (Exception e) { Console.WriteLine(e.ToString()); } } static void Main(string[] args) { StartClient(); Console.ReadLine(); }
'C# with TCP/IP' 카테고리의 다른 글
[Program C#]비동기 서버/클라이언트 msdn 예제 - 콘솔 버전 (0) | 2014.12.26 |
---|---|
[Program C#]동기 서버/클라이언트 msdn 예제 - 윈도우 버전 (0) | 2014.12.23 |
[Program C#]Socket 통신 - 버퍼 사이즈보다 많은 양의 데이타를 받을 시 (0) | 2014.12.23 |
[Program C#]Socket 통신 - Handling Disconnection (0) | 2014.12.23 |
[Program C#]Socket 통신 - 기본 (1) | 2014.12.23 |