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

REST 서버로 채팅 시스템 구현해보기 [Part2-클라이언트 앱 ]


Recommended Posts

REST 서버로 채팅 시스템 구현해보기 [Part1-서버 ] 보러가기

위 링크의 글에 이어서 이번에는 클라이언트 앱을 구현합니다. FMX로 만들어 지므로 모바일 플랫폼에서도 동일하게 작동 됩니다.

REST 서버 구현 글에서 사용하였던 클라이언트 프로젝트를 그대로 활용 합니다. 

화면에는 채팅에 필요한 메모장등을 추가 합니다.

채팅메시지를 상대방에 보내는 버튼(BT_ChatSend) 과 앱 사용자 본인한테 온 채팅 메시지의 전달을 요청하는 버튼( BT_ReadSend) 두개로 이전글의 서버 프로젝트에서 구현한 /ChatSend 와 /ChatRead 2개의 EndPoint 를 호출 합니다.

받아 오는 메시지는 클라이언트 앱의 요청 없이 서버에서 직접 전송하는 방식이 필요하나 이 글에서는 앱이 직접 요청 하는 방식만을 다루고 이후 다른 글에서 서버가 앱에 메시지를 전송하는 방식에 대해 다룰 예정 입니다.

image.png

 

버튼 클릭시 메시지 전송과 메시지를 요청 하는 방법은 아래와 같습니다.

서버에서 만든 EndPoint URL 과 파라미터 항목을 맞춰 줍니다. Post 전송시 파라미터 항목은 TStringList를 사용 하므로 필요한 항목 수 만큼 Add 하면 됩니다.

//*****************************************************************************************************************
// 채팅 전송
// http://127.0.0.1:8080/chatsend?suser=user1&tuser=user2&message=hi
procedure TMCForm.BT_ChatSendClick(Sender: TObject);
var
  i : integer;
  sParamList :TStringList;
  sURL : string;
begin
  sURL := ET_Server.Text + 'chatsend';                // http://127.0.0.1:8080/

  NetHTTPClient1.ContentType   := 'application/json';
  NetHTTPClient1.AcceptCharSet := 'UTF-8';

  sParamList := TStringList.Create;
  sParamList.Add( 'suser=' + ET_SendUser.Text  );
  sParamList.Add( 'tuser=' + ET_TargetUser.Text  );
  sParamList.Add( 'message=' + ET_SendMsg.Text );

  NetHTTPRequest1.Post( sURL, sParamList );
end;

//*******************************************************************************************************************
// 읽기 요청
// http://127.0.0.1:8080/chatread?tuser=user1
procedure TMCForm.BT_ReadSendClick(Sender: TObject);
var
  i : integer;
  sParamList :TStringList;
  sURL : string;
begin
  sURL := ET_Server.Text + 'chatread';

  NetHTTPClient1.ContentType   := 'application/json';
  NetHTTPClient1.AcceptCharSet := 'UTF-8';

  sParamList := TStringList.Create;
  sParamList.Add( 'tuser=' + ET_SendUser.Text  );   // 내 아이디

  NetHTTPRequest1.Post( sURL, sParamList );
end;

 

NetHTTPRequest1RequestCompleted 메소드 안에서 서버에서 받은 pInfo 값에 따라 어떤 요청에 대한 응답 인지를 구분하여 화면에 표현 합니다.

이전 샘플에서는 데이터를 GRID 에 뿌리기 위해 사용한 메소드와 별개로 메모장에 뿌리기 위한 Memo_Write_send 와 Memo_Write_read 메소드를 추가 하였습니다. 

나머지 내용은 이전 샘플의 소스와 동일 합니다.

//*****************************************************************************************************************
procedure TMCForm.NetHTTPRequest1RequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
var
  sJsonData, pInfo : string;
  gDSet : GDListType;
  i, k, arrCount : Integer;
  oJRson, oJField: TJSONObject;
  oArr: TJsonArray;

begin
  // ............................... 
  // 이전글 소스와 동일한 부분 생략
  //................................


  finally
    // 데이터 종류별 화면 처리 분기 ------------------------------
    if ( pInfo = '/querytb' ) then
       StringGrid_Write( StringGrid1, gDSet )

    else if ( pInfo = '/chatsend' ) then
    begin
       StringGrid_Write( StringGrid1, gDSet );
       Memo_Write_Send( MemoChat, gDSet );
    end

    else if ( pInfo = '/chatread' )  then
    begin
       StringGrid_Write( StringGrid1, gDSet );
       Memo_Write_Read( MemoChat, gDSet );
    end


    else if pInfo = 'ERROR_MSG' then
       LogMemo.Lines.Add( GDSet.DArr[0][0] );

    oJRson.Free;
  end;
end;

 

Memo_Write_send 와 Memo_Write_read 

받아온 메시지 데이터가 Grid 에도 함께 표현되므로 Json 배열값의 위치를 쉽게 확인 할 수 있습니다.

이와같이 Json 데이터를 다룰 때는 개발단계에서 Grid를 함께 사용하면 데이터 값과 위치를 쉽게 체크 할 수 있습니다.

//---------------------------------------------------------------------------------------------
// Json Data =>  Memo
procedure TMCForm.Memo_Write_Send( CtMemo : TMemo; GDSet : GDListType );
var
  k, rc : Integer;
  mStr : String;
begin
  rc := high( GDSet.DArr ) + 2;           //  High(GDSet.DArr) 는 배열 최고값 + 1 = 배열전체수   + 1 (컬럼헤드 자리) =  row Count

  for k := 0 to rc - 2 do  // 헤드타이틀 제외 하므로 -2
  begin
    mstr := ' >> ' + GDSet.DArr[ k ][ 1 ];

    CtMemo.Lines.Add( mStr );
  end;
end;


//---------------------------------------------------------------------------------------------
// Json Data =>  Memo
procedure TMCForm.Memo_Write_Read( CtMemo : TMemo; GDSet : GDListType );
var
  k, rc : Integer;
  mStr : String;
begin
  rc := high( GDSet.DArr ) + 2;           //  High(GDSet.DArr) 는 배열 최고값 + 1 = 배열전체수   + 1 (컬럼헤드 자리) =  row Count

  for k := 0 to rc - 2 do  // 헤드타이틀 제외 하므로 -2
  begin
    mStr := (k+1).ToString;  // 인덱싱 표시
    mstr := mstr + ' : ' + GDSet.DArr[ k ][ 3 ];

    CtMemo.Lines.Add( mStr );
  end;
end;

 

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

이 토의에 참여하세요

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

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...

중요한 정보

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