본문 바로가기

 

프로토콜 1


응용 프로그래밍에서 네트워크를 사용해 데이터를 송수신 할때 사용하는 규칙을 의미한다.

 

네트워크 응용 프로그래밍에서, 일반적으로 데이터를 보낼 때는 정확한 바이트 파악 할 수 있다.

하지만 데이터를 받을 때는 몇 바이트가 올지 알 수가 없다.

그리고 데이터가 분산되어 여러번 전달 될 수도 있다.

 

그렇기에 네트워크 응용 프로그래밍은 서버와 클라이언트 사이에

주고 받는 데이터의 크기 및 데이터 구조 등에 대해 프로토콜(규칙)을 개발자가 정해야 한다.

 

프로토콜(규칙)의 예시

  • 헤더에 차후 보낼 바이트의 크기 전송한다.
  • 전달하는 데이터 마지막에 특정한 End of Message 마크를 사용한다.
  • 일정 시간 아무 데이타가 없으면 수신 종료한다.
  • 연결 종료시점까지 데이터를 읽는 방법

    만약 이러한 프로토콜이 없고 수신 데이타 크기를 미리 알 수 없다면, 상대방에서 TCP Connection을 종료했을 때 Read() 메서드가 0 을 리턴하므로 이를 체크함으로써 데이터 읽기를 종료할 수 있다.

    일반적으로 서버가 Connection을 먼저 닫는지, 클라이언트가 Connection을 먼저 닫는지는 프로토콜마다 다르다. 
    HTTP 프로토콜의 경우 서버가 먼저 TCP Connection을 닫고, 브라우저 클라이언트가 뒤따라 Connection을 닫는다.

 

아래 예제는 Client에서 TCP Connection을 닫을 때까지 계속 데이터를 읽어 들이는 예제다.

Socket_Server.zip
0.17MB
TCPClient_Protocol.zip
0.18MB

Server

  • 서버는 2. .Net Socket 예제의 Socket_Server 코드이고, Server 에서 먼저 소켓 연결을 종료한다.
  • TCPListener 예제의 Server 코드를 동작시키면 Client 와 Server가 모두 동기화 코드이기때문에, 서로 Read 대기 상태에서 무한히 멈추게된다. 
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // [1] 서버 소켓 생성
        Socket Server_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // [2] IP, Port 를 "서버 소켓"에 등록
        //Server_Socket.Bind(new IPEndPoint(IPAddress.Any, 7000));
        IPEndPoint ipt = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7000);
        Server_Socket.Bind(ipt);

        // [3] 준비된 "서버 소켓"이 클라이언트의 접속 요청을 대기하도록 명령
        // 일반적으로 listen은 접속요청이 올 때까지, 블록되어 대기 상태
        Server_Socket.Listen(100);

        // 클라이언트로부터 대기준인 서버 소켓으로 접속 요청이 들어오면 Listen()이 다음 로직을 진행한다.
        // [4] 대기중인 서버 소켓이 Aceept( )를 실행하고, 서버는 클라이언트와 연결이 성공된 소켓을 하나 더 만든다.  
        Socket Connected_Socket = Server_Socket.Accept(); // 블로킹 함수

        // 데이터를 주고 받는 규격 상자 (택배 상자)
        // 정해진 버퍼 크기만큼 주고 받기로 약속되어야 한다.
        byte[] receiverBuff = new byte[2048];

        // [5] 서버 로직은, 연결된 소켓으로 데이터를 주고 받는다.
        int len = Connected_Socket.Receive(receiverBuff);
        string data = Encoding.UTF8.GetString(receiverBuff, 0, len);
        Console.WriteLine("전달받은 데이터 문장 >> \"" + data + "\"");

        // 받은것을 다시 보낸다.(Echo)
        Connected_Socket.Send(receiverBuff);

        // [6] 연결된 소켓을 닫는다.
        Connected_Socket.Close();

        // 서버를 닫는다.
        Server_Socket.Close();

    }
}

 

Client

  • 클라이언트는 서버에서 연결이 끊길때까지 읽어들인다.
using System.Net.Sockets;
using System.Net;
using System.Text;

namespace TcpServerTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // [1] 접속 할 서버의 IP, PORT 정보넘겨받아 바로 연결한다.
            TcpClient tc = new TcpClient("127.0.0.1", 7000);

            // [2] 송수신

            // 송신 할 문장 준비
            string msg = "안녕하세요. TCPClient & TCPListener 사용 테스트입니다.";
            byte[] buff = Encoding.UTF8.GetBytes(msg);

            // 보낸다
            NetworkStream stream = tc.GetStream();
            stream.Write(buff, 0, buff.Length);

            // 받는다.

            // 버퍼
            byte[] receiverBuff = new byte[2048];

            // stream에서 버퍼로 Read된 하여 MemoryStream에 계속 Write
            MemoryStream mem = new MemoryStream();

            // NetworkStream 에서 버퍼로 Read된 크기
            int nbytes;
            //TCP Connection을 종료되면 Read() 메서드가 0 을 리턴한다.
            while ((nbytes = stream.Read(receiverBuff, 0, receiverBuff.Length)) > 0)
            {
                Console.WriteLine(nbytes);
                mem.Write(receiverBuff, 0, nbytes);
                Console.WriteLine(nbytes);
            }
            Console.WriteLine("4");

            // 요소를 새 바이트 배열에 복사한다.
            byte[] outbytes = mem.ToArray();

            // 복사되었기에 메모리 스트림을 닫는다
            mem.Close();

            // (5) 스트림과 TcpClient 객체 닫기
            stream.Close();
            tc.Close();

            Console.WriteLine(Encoding.UTF8.GetString(outbytes));
        }
    }
}

 

 

프로토콜 2


통신 장비 사이에서 메시지를 주고 받는 양식과 규칙의 체계를 의미한다.

계층 프로토콜의 예
응용(Application) HTTP, SMTP, FTP, Telnet
표현(Presentation) ASCII, MPEG, JPEG, MIDI
세션(Session) NetBIOS, SAP, SDP, NWLink
전송(Transport) TCP, UDP, SPX
네트워크(Network) IP, IPX
데이터 링크(Data Link) Ethernet, Token Ring, FDDI, Apple Talk

 

 

BasicLike

어? 나 프로그래밍 좋아하네?