Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 May : Re: TIdTCPServer-Client Can I send to the client when I want to

www.cryer.info
Managed Newsgroup Archive

Re: TIdTCPServer-Client Can I send to the client when I want to

Subject:Re: TIdTCPServer-Client Can I send to the client when I want to
Posted by:"PeaShooter_OMO" (jacquesv..@homemail.co.za)
Date:Thu, 11 May 2006 00:55:01

Thank you for your help....

I will be looking into it.... ALSO I have seen alot of posts where you
(Remy) have answered to other people and I have alsways found your responses
very helpful... THANK YOU!!! It is much appreciated from my side and I think
from alot of the other post readers!

"Remy Lebeau (TeamB)" <no.spam@no.spam.com> wrote in message
news:445f8fe2$3@newsgroups.borland.com...
>
> "PeaShooter_OMO" <jacquesvdm@homemail.co.za> wrote in message
> news:445f21f3@newsgroups.borland.com...
>
>> I have seen quite a few examples on how to write Client/Server apps
>> with TIdTCPServer and TIdTCpClient and most do the following:
>
> That is the typical client/server model in general.  In most situations,
> the
> clients tell the server what to do.  Not the other way around.
>
>> I would like to do things a bit differently, so how do I send something
>> (a
>> string for example) to a TIdTCPClient from a TIdTCPServer whenever
>> needed
>
> You need to find the appropriate client in the server's Threads (Indy 9)
> or
> Contexts (Indy 10) property.  You can then access the Connection property
> for that client.  Just make sure that you are not writing to the client at
> the same time that the server is responding to a command from the same
> client elsewhere.  It is very easy for the server to corrupt its
> communications with that client if multiple threads are trying to push
> data
> to the client at the same time.
>
>> is there a way for the TIdTCPClient to know that it has text waiting
>> to be read without using a timer to poll for incoming?
>
> Indy uses blocking sockets.  Unlike non-blocking sockets, blocking sockets
> do not trigger any events when things happen on the socket.  Polling
> periodically is the only way to detect incoming data on a blocking socket
> without actually reading the data.  Otherwise, use a thread instead of a
> timer, and perform blocking reads that wait for data to arrive.
>
>> 2. The client asks for something and receives a response if needed
>> from the server. (optional)
>>
>> ...time goes by
>>
>> 3. Something happens on the server and it sends something to the client
>
> In order to do that reliably, you need to synchronize access to the socket
> on the server end, so that the server doesn't try to send a response at
> the
> same time as an unsolicited packet, and vice versa.  You should also
> format
> your packets from the server in such a way that the client can easily
> differentiate between them.  Such as with a fixed-length header that
> indicates whether the packet is in response to a command (and which
> command)
> or whether the packet is a server-generated event.
>
>> Is this possible
>
> Technically, yes.  Though you may have to re-think your protocol design in
> order to handle it effectively.
>
>> will I keep the client connections open for the whole time in case
>> the server wants to send something to the client
>
> Yes.  Normally, you should be doing that anyway, unless your protolc
> requires a disconnect after each response is received.
>
>> I was thinking about having both TIdTCPClient and TIdTCPServer components
>> on both the Client and Server sides
>
> That is not needed.
>
>
> Gambit

Replies:

none

In response to:

www.cryer.info
Managed Newsgroup Archive