안녕하세요 현재 XE2환경에서 채팅프로그램을 만들고있습니다.
주고받는 데이터형태는 구조체 인데 아래와 같습니다
typedef struct MESSAGE
{
char Id[10];
char Text[100];
}buff;
● 동작구현
1. 사용자가 에디트창에 문장을 입력한후 전송버튼을 누르면 구조체형태에 MESSAGE가 서버쪽으로 전송됩니다
TMemoryStream* stream = new TMemoryStream();
try {
stream->WriteBuffer(&p, sizeof(buff));
stream->Position = 0;
IdTCPClient1->Socket->Write(stream, sizeof(buff), true);
} catch (Exception *e) {
Memo1->Lines->Add(e->Message);
}
delete stream;
2. 서버에서 IdTCPServer1Execute 이벤트 메소드에서 데이터를 다음과같은 형태로 받아줍니다
void __fastcall TForm6::IdTCPServer1Execute( TIdContext * AContext )
{
TMemoryStream * stream = new TMemoryStream();
buff p;
try
{
while ( AContext->Connection->Connected() )
{
if ( !AContext->Connection->Socket->Readable( 1000 ) )
{
continue;
}
try
{
stream->Clear();
stream->Position = 0;
AContext->Connection->IOHandler->ReadStream( stream );
buff *t = (buff *)stream->Memory;
stream->Position = 0;
stream->ReadBuffer( &p, sizeof( buff ) );
TList *List; // 추후 TThreadList *List;로 변경
TIdContext *AContext;
List = IdTCPServer1->Contexts->LockList();
try {
for ( int i = 0; i < List->Count; i++ )
{
AContext = static_cast < TIdContext * > ( List->Items[ i ] );
TMemoryStream* stream = new TMemoryStream();
stream->WriteBuffer(&p,sizeof(p));
stream->Position = 0;
AContext->Connection->IOHandler->Write(stream, sizeof(p), true);
}
} __finally {
IdTCPServer1->Contexts->UnlockList();
}
}
catch ( Exception * e )
{
ListBox1->Items->Insert( 0, e->Message );
}
}
}
__finally
{
delete stream;
}
}
3. 여기서부터 질문인데
① 서버에서 클라이언트로 구조체 전송을했습니다. 클라이언트에서 서버로 데이터를 받을때 타이머에서 일정시간마다 데이터가 왔는지 체크하는수밖에없나요? 타이머를 부득이한경우가 아니면 안쓰는게 좋다고 들었는데요
② 구조체형태를 주고받을때 buffer형태로 데이터를 전송하는게 좋을까요?
책없이 오직 빌더포럼에만 의존해서 코딩할려니 너무 힘드네요 고수님들의 조언부탁드리겠습니다
|