안녕하세요, 이번 글에서는 텍스트만 보내는 것이 아니라 사진이나 파일을 보내는 기능이 추가된 프로그램을 만들어보려고 합니다.


이전에 만들었던 채팅 프로그램의 경우 단순히 텍스트만 보내는 기능이 있었기에 크게 복잡하지 않았고, 헤더 라는 것을 만들어서 사용하지도 않았습니다. (헤더가 무엇인지는 잠시 후에 설명드리겠습니다)


하지만, 이번 글의 경우 사진이나 파일 등을 보내는 기능을 추가할 것이므로 데이터 형식에 따라 각각 다르게 처리를 수행해야 합니다.

  • 텍스트를 수신한 경우 / 보낼 경우  
  • 파일을 수신한 경우 / 보낼 경우
  • 사진을 수신한 경우 / 보낼 경우

텍스트를 수신한 경우는 이전 채팅 프로그램과 동일하게 수행합니다. -> 텍스트를 수신한 경우 텍스트박스에 받은 텍스트를 보여준다

파일을 수신한 경우 -> 어디에 저장할 것인지 확인하고 다운로드를 수행한다

사진을 수신한 경우 -> 이 경우는 조금 복잡하게 수행할 필요가 있습니다. 사진을 보여주기만 할 것인지, 파일로 저장해서 보여줄 것인지.


각각의 데이터 형식을 구분하기 위해서 우리는 헤더라는 공통 형식을 만들고 그 형식에 맞게 통신 약속을 해야 합니다.

통신 약속을 하는 이유는 A가 사진을 보낸다고 할 때 B에서 온전히 사진을 받도록 하기 위함입니다.

통신 약속을 하지 않는다면 A가 사진을 보냈을 때 B가 사진이 아닌 다른 데이터 형식(텍스트 등)으로 받을 수도 있기 때문입니다.


글로만 보시는것 보다는 사진과 같이 설명드리면 이해하기가 좀 더 쉬워질 것 같습니다.


(Photo by Lukas from Pexels)


우리는 엄지를 올리는 것(Thumbs up, 따봉이라고 하죠...ㅋㅋㅋ)을 긍정적인 표현으로 사용하고 있습니다. 하지만 이 표현을 부정적인 표현으로 받아들이는 문화권에서 쓴다면 우리의 의도와는 다르게 해석되게 됩니다. 나는 분명 고마움을 표하려고 사용했는데 상대방은 되려 나한테 화는 상황이 생길 수 있다는 것이죠.


그럼 헤더는 어떤 의미를 가지고 있으며, 어떻게 만들 수 있을까요?

헤더(header)란, 영어 그대로 제일 위 또는 앞(head)에 위치한 데이터를 말합니다. 우리가 알고 있는 파일들(음악/동영상/프로그램 등)도 모두 각각의 고유 헤더를 가지고 있습니다.

여기서 사용할 헤더는 채팅 프로그램에서 고유하게 사용할 것이므로 필요한 용도나 확장성 등을 고려하여 만들면 됩니다.


우리가 흔히 사용하는 인터넷은 IP(Internet Protocol)를 사용하여 통신합니다. 그리고 이 프로토콜에서 사용하는 헤더도 있는데요.

인터넷 프로토콜(IP)를 사용하여 A 라는 문자가 하나만 있는 페이지를 보기 위해 접속한다고 가정했을 때 헤더는 아래 그림처럼 40+@ bytes를 차지하게 되고 실제 데이터 부분은 A가 되서 총 40+@+1 bytes를 수신하게 됩니다. (HTTP 요청 헤더 등은 없고 데이터만 있다고 가정)


(출처: RFC-791#3-1, Internet Header Format)


헤더가 어떤 역할을 하는지 이제 감이 조금 오시나요? 어떤 작업을 하거나 파일의 정보 등을 기록하기 위해 사용되는 앞에 위치한 데이터를 "헤더"라고 합니다.


이제 프로그램에서 사용할 헤더를 만들어야 합니다.

간단하게 통신할 것이므로 데이터의 형태 / 데이터의 길이 / 실제 데이터 정도면 충분하겠네요.


데이터 형식은 총 3개(텍스트, 사진, 파일)가 될 수 있으므로 각각 1, 2, 3의 값을 가지도록 약속하겠습니다. 데이터 형식 필드의 값이 0 이거나 4 이상일 경우엔 잘못된 데이터 형식으로 간주합니다.


헤더와 관련된 얘기는 여기까지 하고 다음 글에서는 실질적인 데이터 전송에 관해 알아보도록 하겠습니다.

긴 글 읽어주셔서 감사합니다.

+ Recent posts