인디 보다는 성능이 떨어지지만
인디 사용하지 않을때 간편하게 사용하기 좋은게 TTcpClient / TTcpServer 입니다.
인디 정도로 세밀하게 제어하는게 안되지만 간단한 용도로는 괜잖습니다.
TTcpClient / TcpServer 사용법이 비슷한데,
간단히 예제로 만들어 봤습니다.
참고로
TClientSocket / TServerSocket 는 버그도 있고 성능도 나빠 않쓰는게 좋습니다.
TClientSocket는 간단한 용도로 쓰는 것도 나쁘지 않지만
TServerSocket는 성능이 조금 나쁩니다. 접속을 제대로 인지 못하는 경우가 가끔 있는데,
물론 용도에 따라서는 사용해도 되겠지요.
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
try
{
do
{
TcpClient2->RemoteHost = "www.yahoo.co.kr";
TcpClient2->RemotePort = 80;
TcpClient2->Connect();
if (!TcpClient2->Connected)
break;
TcpClient2->Sendln("GET /");
String s;
do
{
s = TcpClient2->Receiveln("\n");
Memo1->Lines->Add(s);
} while(s != "");
} while(false);
// 접속되던 안되던 반드시 Disconnect 메소드를 호출해주어야
// Handle이 반환되어 종료시 불필요한 이벤트 발생을 막을 수 있다.
//
TcpClient2->Disconnect();
}
catch(...)
{
Memo1->Lines->Add("TcpClient는 Indy와 달리 에러시 예외가 발생하지 않는다.");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Connect(TObject *Sender)
{
Add("# connect");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2CreateHandle(TObject *Sender)
{
Add("# create handle ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2DestroyHandle(TObject *Sender)
{
Add("# destory handle ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Disconnect(TObject *Sender)
{
Add("# disconnect");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Error(TObject *Sender, int SocketError)
{
Add("# error");
Add(SocketError);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Receive(TObject *Sender, PChar Buf,
int &DataLen)
{
Add("# recv");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpClient2Send(TObject *Sender, PChar Buf,
int &DataLen)
{
Add("# send");
}
//---------------------------------------------------------------------------
Add는
void Add(String s)
{
Memo1->Lines->Add(s);
}
접속시 이벤트 발생순서는
# create handle
# connect
# send
# recv
# disconnect
# destory handle
TTcpServer 간단 예제는
서버는 접속이 발생하면 GetThread 이벤트가 발생하는데
이때 필요한 만큼 쓰레드가 생성되고,
이후 아래 Accept 핸들러로 접속 클라이언트 소켓을 가지고 제어가 넘어오게 됩니다.
여기서 마치 인디의 Execute 핸들러처럼 작업해주면 됩니다.
//---------------------------------------------------------------------------
void __fastcall TForm1::TcpServer1Accept(TObject *Sender,
TCustomIpClient *ClientSocket)
{
Add("# accept");
int len;
// thread loop
//
do
{
len = ClientSocket->ReceiveBuf(&t, size, 0);
ClientSocket->SendBuf(data, size);
// 클라이언트 접속이 종료되거나 에러가 나면 len이 0 값이 넘어 온다.
} while(len > 0);
ClientSocket->Close();
Add("# end accept");
}
//---------------------------------------------------------------------------
|