Server Side Chat Application with Borland Delphi/Indy, concluded - The heart of the application
(Page 3 of 4 )
The next procedure is the heart of the server application. This is where all the messages and commands are dealt with. Go to the object inspector, this time double click on Onexecute and add the code below:
procedure TForm1.tsExecute(AContext: TIdContext);
var
msg,str,toname,filename,cmd,from,orsender:string;
FStream,fstream2: TFileStream;
IdStream,idstream2: TIdStreamVCL;
MStream: TMemoryStream;
idx,posi,col:integer;
Name1,Name2,Name3,MainStr: string;
begin
//get the message/command from the client
str:=acontext.Connection.IOHandler.ReadLn;
//split the message into three sections
posi:=pos('@',str);
cmd:=copy(str,1,posi-1);
//what is the command?
if cmd='listnames' then begin
//client asked for a list of connected client names
//send it!
TMyContext(AContext).SendNicks;
end
//client wants to sent a message to everybody
else if cmd='all' then begin
//cutt message up in three parts. Here you only need the senders name and message
ParseString(str, name1,msg,from);
//send it!
tmycontext(acontext).broadcastMsgAll(from,msg);
end
//client request a screenshot
else if cmd='takeshot' then begin
acontext.Connection.IOHandler.WriteLn('taking picture...');
//take the picture
screenshot;
FStream := TFileStream.Create('scrnshot.jpg', fmOpenRead or
fmShareDenyWrite);
try
IdStream := TIdStreamVCL.Create(fstream);
try
//inform client that you are sending the image file
AContext.Connection.IOHandler.WriteLn('pic@Sending file...');
//send the image
AContext.Connection.IOHandler.Write(IdStream, 0, True);
AContext.Connection.IOHandler.WriteLn('done!');
finally
IdStream.Free;
end;
finally
FStream.Free;
end;
end
//client wants to send a private message
else if cmd='name' then
begin
//cut the message in three: to@message:from
ParseString(str,toname,msg,from);
//send to recipient
TMyContext(AContext).SendMsg(from, msg);
end
//client is sending a file
else if cmd='file' then
begin
parsestring(str,name1,name2,name3);
MStream := TMemoryStream.Create;
try
IdStream := TIdStreamVCL.Create(MStream);
try
AContext.Connection.IOHandler.ReadStream(IdStream);
mstream.SaveToFile(name3);
finally
IdStream.Free;
end;
finally
MStream.Free;
end;
TMyContext(AContext).SendFile(name2,name3);
end
else
if (cmd<> 'listnames') and (cmd<>'all') then begin
idx:=pos('@',str);
toname:=copy(str,1,idx-1);
msg := Copy(str, Pos('@', str)+1, Length(str)-Pos('@', str));
TMyContext(AContext).SendMsg(toname, msg);
end ;
end;
Next: Code for leaving a chat >>
More Delphi-Kylix Articles
More By Jacques Noah