Indy TcpServer, TcpClient를 이용하여 메신저 프로그램을 만들고 있습니다.
TcpClient에서 TcpServer로 메시지를 보내면 TcpServer에서는
OnExecute 이벤트에서 모든 클라이언트에게 메시지를 뿌려줍니다.
그런데 OnExecute 이벤트 말고 접속한 특정 클라이언트에게만 메시지를 보낼려고 아래와 같이 코딩 하였습니다.
----------------------------------------------------------------------------------
procedure TMainForm.lvClientClick(Sender: TObject);
var
ActClient: PClient;
CommBlock: TCommBlock;
RecThread: TIdPeerThread;
Msg : string;
begin
if lvClient.ItemIndex = -1 then
exit;
ActClient := Clients.LockList.Items[lvClient.ItemIndex];
RecThread := ActClient.Thread;
Msg := InputBox('Disconnect Message', 'Enter a reason for the disconnect', '');
Msg := Trim(Msg);
Msg := edtSysName.Text + '> ' + Msg;
if Msg <> '' then
begin
CommBlock.Command := 'CMD_MESSAGE';
CommBlock.UserId := lvClient.Items[lvClient.ItemIndex].Caption;
CommBlock.UserName := lvClient.Items[lvClient.ItemIndex].SubItems[0];
CommBlock.ProductName := '';
CommBlock.ProductNumber := '';
CommBlock.ReceiverId := '';
CommBlOCK.ReceiverIp := '';
CommBlock.Msg := Msg;
CommBlock.FileApproval := 'F_NONE';
CommBlock.FileName := '';
CommBlock.FileSize := -1;
RecThread.Connection.WriteBuffer(CommBlock, SizeOf(CommBlock), True);
end;
end;
----------------------------------------------------------------------------------
위 프로시저는 ListView의 OnClick 이벤트 입니다. 그리고 Clients는 TThreadList 이고요... 위와 같이 코딩해서 특정 클라이언트에게 메시지를 보내면 서버쪽의 소켓이 죽어 버립니다.... 도대체 왜그런지... Indy의 버그는 아닌지...
OnExecute 이벤트 말고 그냥 버튼 클릭으로 클라이언트 사용자에게 메시지를 보낼려면
어떻게 해야하는지요... 위 코딩방법이 맞는거 같은데... 아닌가?
여러 고수님들의 가르침 부탁 드립니다.