|
안녕하세요.. 물고기 좋아하는 넘입니다.
어떤 분(고마운 분)이 올려주신 자료를 가지고 채팅 서버를 만들려구 하는데...
에러가 엄청나게 나네요..... )_- ;;;
엄치 불구하고 다시 이렇게 질문을 올립니다. 자료는 찾아 볼데로 봤는데...
개념부족인지... 어디가 잘못되었는지도 애매하고, 해결책은 깜깜하네요.. ^^
제가 궁금한 점은
1. Server에서 Client가 자료를 보내온 시점을 어떻게 알지요?
1:1에서는 Event가 발생한 시점을 체크하면 되는데 ...
아래의 코드처럼. while문안에서 계속 연결하고, 받을거 있는지 검사하고, 해제하고
를 반복하면.. 부하가 많이 생길것 같은데...이렇게 하는게 맞나요??
2. Server의 Thread안에서 ClientSocket이라는 프로퍼티가 있는데..
여기서 바로 Client로 자료를 보낼 수는 없나요?
3. Thread에서 TWinSocketStream이눔을 쓰는 이유는 뭐죠??
(Liseten을 위한 점검을 위해서 인가요??)
4. TCustomWinSocket 과 TServerWinSocket, TClientWinSocket의 차이점은 뭔가요??
입니다.
그리고, 제가 이해한 건는 아래와 같습니다.
접속 유지용 만들기...........................................................
TServerClientThread를 상속 받아서 정의한 클래스를
ServerSocket의 GetThread Event에서 new로 생성해서 시스템에 넘겨줍니다.
이때, 접속된 소켓의 정보는 GetSocket Event에서 받아 놓습니다.
Thread안에서 while (!Terminated && ClientSocket->Connected)을 통해서 루프를 돌려주면...
일단은 접속은 유지가 되겠군요...
접속 끊기....................................................................
1)Client에서 : 그냥.. 끊었어.. 그럼, 서버의 ServerSocket에서
ClientDisconn Event가 발생하면 그걸 사용.
2)Server에서 : ServerSocket에서 ClientSocket 메소트를 이용해서 Close시킴.
클라이언트에서 서버로 자료 전송하기..........................................
Client에서 그냥 SendText(String)을 통해서 보내..
그럼, Server에서는 돌아가는 Thread에서 이눔을 받아야 하는데...
아래의 Client Execute에서 pStream->Read(Buffer, sizeof(Buffer))을 통해서 받아냅니다.
(요건 잘 받아집니다. ^^)
서버에서 클라이언트로 자료 전송하기..........................................
ClientSocket->SendText((String)Buffer); //이렇게 하면 아무런 반응이 없다.
왜없는지는 모르겠심다... -_-;;;;
그래서 Server에서 void TMySocketThread :: MessageBack(char* Msg) 이라는 함수를 만들고,
Client에서 OnRead Event에서 String msg = Socket->ReceiveText(); 을 했습니다.
그래도 않됩니다.
왜않되는지 모르겠심다... -_- ;;;
아래는 소스입니다... Help에 있는거 거의 그대로 썬는데.. TT ;;;
void __fastcall TMySocketThread::ClientExecute(void)
{
TWinSocketStream *pStream;
char Buffer[256];
// make sure connection is active
while (!Terminated && ClientSocket->Connected)
{
pStream = new TWinSocketStream(ClientSocket, 60000);
try
{
if(pStream->WaitForData(30000))
{
memset(Buffer, 0x00, sizeof(Buffer));
if( pStream->Read(Buffer, sizeof(Buffer)) != 0 )
{
Form1->Memo1->Lines->Add((String)Buffer);
//ClientSocket->SendText((String)Buffer); //이렇게 하면 아무런 반응이 없더군요.
MessageBack(Buffer);
}
else
{
if(pStream != NULL)
{
delete pStream;
pStream = NULL;
}
}
}
else
{
if(pStream!=NULL)
{
delete pStream;
pStream = NULL;
}
}
}
__finally
{
if(pStream!=NULL)
{
delete pStream;
pStream = NULL;
}
}
}
}
void TMySocketThread :: MessageBack(char* Msg)
{
int iSocket = StrToInt(Form1->ListBox1->Items->Strings[0]);
TCustomWinSocket* pWinSocket = new TCustomWinSocket(iSocket);
pWinSocket->SendText((String)Msg);
delete pWinSocket;
}
|