Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

UDP로 앱에 메시지 전송하는 방법 ~ REST 방식의 채팅 구현 시 서버에서 채팅알람 전송 예시


Recommended Posts

어플리케이션 간에 메시지를 전송 하는 방법은 여러가지 방식이 있고 각각의 상황에 맞는 방식을 사용하면 되는데

이번에 소개할 UDP 방식은 사용법이 매우 간단하다.

또한 TCP 통신처럼 커넥션을 유지해야 하고 연결이 안될때 에러 처리를 해야 하는 어려움 없이 사용 가능 하다는 장점이 있다.

UDP 통신은 주로 서버에서 여러 클라이언트들에게 동시에 메시지를 전달하는 용도로 사용이 편리하여 여러대의 장비에 동시에 명령을 전송 할때 요긴하게 사용 된다. 이때 오프라인이 되어 있는 장비에게 메시지가 전달되어도 서버쪽에서는 에러가 발생 하지 않기 때문에 서버에 부담을 주지 않는다.

메시지를 전송 받은 클라이언트는 응답을 서버에 보내 주는 방식으로 서버쪽에서는 전송이 성공 된 장비와 실패된 장비에 대해서 충분히 파악이 가능하다.

UDP 에서는 메시지를 받는쪽에서 TIdUDPServer 컴포넌트를 사용하고 보내는 쪽에서는 TIdUDPClient 컴포넌트를 사용 하므로 위에서 언급한 서버/클라이언트 개념과 반대로 생각하면 된다.

이전 게시글에서 설명한 REST 채팅 방식의 경우 상대방이 서버에 전송한 메시지를 타겟 유저가 읽기 위해서는 서버에 메시지를 읽으러 가야 하는 방식 이므로 실시간으로 메시지를 받기 위해서 UDP 로 채팅서버(UDP Client) 가 타겟 유저 (UDP Server) 에게 메시지 알람을 전송하는 방식을 추가 하면 완전한 실시간 채팅이 가능해 진다.

REST 서버로 채팅 시스템 구현 게시글 보러가기

메시지를 보내는 쪽에서 TIdUDPClient  컴포넌트를 가져다 놓고 아래 소스와 같이 IdUDPClient1.Send 를 사용하여 메시지를 전송 하면 된다.

받는 대상의 IP Address 는 알고 있어야 하며 포트는 양쪽에서 동일하게 임의의 포트로 맞춰 주면 된다.

Try Except를 사용하면 전송에러 발생시 시스템 내부 메시지 팝업 박스가 뜨는것을 방지 할 수 있는 효과가 있다.

image.png


procedure TClientForm.BT_SendClick(Sender: TObject);
begin
  try
    IdUDPClient1.Send ( ET_Target.Text, 9000,  Edit1.Text, IndyTextEncoding_UTF8 ); // Uses IdGlobal
  except
      on e: Exception do begin
            LogMemo.Lines.Add( e.Message );  // 에러 로그 출력
      end;
  end;
end;

 

메시지를 수신 하는 쪽에서는 TIdUDPServer 컴포넌트를 가져다 놓으면 되면 메시지 수신시 OnUDPRead 이벤트가 발생 하므로 이곳에서 받은 메시지를 처리 하면 된다.

샘플소스에서 부가적으로 구현한 Get_IP4Address() 함수는 자신의 IP Adress를 읽어 오는 역활을 하는데 채팅 프로그램등에서 IP Address를 알아내야 하는 경우 요긴하게 사용 할 수가 있어서 덧붙여 놓았다.

image.png

Uses
  IdStack;

{$R *.fmx}

procedure TSeverForm.FormCreate(Sender: TObject);
begin
   ET_IP.Text :=  Get_IP4Address()  // 자신의 IP 읽어오기
end;

procedure TSeverForm.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
   Memo1.Lines.Add( '>> '  +  BytesToString( AData, IndyTextEncoding_UTF8 ) );
end;

function TSeverForm.Get_IP4Address() : string;
var
  IPs: TStringList;
  IP: String;
  I: Integer;
  Err: Boolean;
begin
  IPs := TStringList.Create;
  try
    GStack.AddLocalAddressesToList(IPs);
    for I := 0 to IPs.Count-1 do
    begin
      IP := IPs[I];
      IPv4ToUInt32(IP, Err);    
      if not Err then
        Break;
      IP := '';
    end;
  finally
    IPs.Free;
  end;
  if IP <> '' then
  begin
    result := IP;
  end;
end;

 

구현 예시 : FMX 프로젝트의 경우 모바일에서도 작동.

image.png

 

 

이 댓글 링크
다른 사이트에 공유하기

  • c2design changed the title to UDP로 앱에 메시지 전송하는 방법 ~ REST 방식의 채팅 구현 시 서버에서 채팅알람 전송 예시

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.