[C# 강좌 - 34] 소켓 통신 - 3


Study/C#  2012. 10. 8. 23:01

안녕하세요 개발자 명월입니다.


요즘 날씨가 급격히 추워져서 감기 조심하셔야겠습니다. 이거이거 감기때문에 블로그 포스팅에도 지장이 오네요.

그럼 지금 부터 핼퍼클래스에 대해서 알아보도록 하겠습니다.

 

네트워크 통신이라고 하는 것은 규약이 워낙 많기 때문에 네트워크의 대한 원리를 잘 이해하지 못하면 사용하기 힘듭니다. 그래도 있는 것이 핼퍼클래스이나 제 개인적인 생각에는 이 핼퍼 클래스도 네트워크의 원리를 이해 못하면 사용하기 힘듭니다. 결국에는 어느 정도를 이해하면 소켓을 그냥 사용하지 굳히 핼퍼를 사용하지 않습니다.

또 핼퍼를 사용하면 C++, Java 등에 아무래도 호환성 문제가 생기게 마련입니다.

 

그래도 우리의 성경책인 MSDN에서는 초심자들이 사용하기 쉽게 묶어놓은 클래스라고 하니 조금 알아보도록하겠습니다.

핼퍼클래스는 총 TCPListener (서버), TCPClient (클라이언트), UDPClient(UDP 는 딱히 서버,클라이언트 구분이 없습니다.) 로 나뉘겠습니다.


먼저 MSDN을 살펴보도록 하겠습니다.

MSDN - TCPListener 바로가기

            TCPClient 바로가기

            UDPClient 바로가기

 

 

 


p>

TCPListen 소스 입니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Blog_Listener_20121008
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            TcpListener server = new TcpListener(9999);
            server.Start();
            TcpClient client = server.AcceptTcpClient();
            NetworkStream NS = client.GetStream();
            byte[] _data = new byte[1024];
            NS.Read(_data, 0, 1024);
            Console.WriteLine(Encoding.Default.GetString(_data));
            byte[] _buf = Encoding.Default.GetBytes("접속을 환영합니다.");
            byte[] _data2 = new byte[1024];
            for (int i = 0; i < _buf.Length; i++)
            {
                _data2[i] = _buf[i];
            }
            NS.Write(_data2, 0, 1024);
            NS.Close();
            
            client.Close();
            server.Stop();

            Console.WriteLine("Press Any key...");
            Console.ReadLine();
        }
    }
}

TCPClient 소스입니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Blog_Client_20121008
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            TcpClient client = new TcpClient();
            client.Connect(IPAddress.Parse("127.0.0.1"), 9999);
            NetworkStream NS = client.GetStream();
            byte[] _buf = Encoding.Default.GetBytes("명월접속");
            byte[] _data = new byte[1024];
            for (int i = 0; i < _buf.Length; i++)
            {
                _data[i] = _buf[i];
            }
            NS.Write(_data, 0, 1024);
            byte[] _data2 = new byte[1024];
            NS.Read(_data2,0,1024);
            Console.WriteLine(Encoding.Default.GetString(_data2));
            
            NS.Close();
            client.Close();
            
            Console.WriteLine("Press Any key...");
            Console.ReadLine();
        }
    }
}

Listener

 

Client

 

결과입니다.

 

여기까지 참고소스 입니다.


Blog_Client_20121008.zipBlog_Listener_20121008.zip

 

UDP 예제는 두개로 분활하기 귀찮으니 스레드로 두개를 만들어 보겠습니다.

강좌 바로가기- 쓰레드 강좌 보러가기


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace Blog_udp_20121008
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            new Thread(new ThreadStart(Server)).Start();
            new Thread(new ThreadStart(Client)).Start();

            Console.ReadLine();
        }
        public void Server()
        {
            byte[] data = new byte[1024];
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
            UdpClient server = new UdpClient(ipep);
            Console.WriteLine("Server Write : 서버 시작");
            data = server.Receive(ref ipep);
            Console.WriteLine("Server Write : {0} 에서 보낸 데이터 : {1}", ipep.ToString(), Encoding.Default.GetString(data));
            data = Encoding.Default.GetBytes("명월서버에 환영합니다.");
            server.Send(data,data.Length,ipep);
            server.Close();
        }
        public void Client()
        {
            UdpClient client = new UdpClient("127.0.0.1",9999);
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any,0);
            String _buf = "Hello world";
            byte[] data = Encoding.Default.GetBytes(_buf);
            client.Send(data, data.Length);
            data = new byte[1024];
            data = client.Receive(ref ipep);
            Console.WriteLine("Client Write : 서버에서 보낸 데이터 : {0}", Encoding.Default.GetString(data));
            client.Close();
        }
    }
}

 

 

결과화면입니다.


 

참고 소스입니다.

 

Blog_udp_20121008.zip