一
一个过客
Unregistered / Unconfirmed
GUEST, unregistred user!
最近要开发一个网络软件,进行到一半不得不停下来思考一个问题:
比如这个软件是一个基于TCP/IP协议的网络聊天软件,程序流程中
经常是 发送一个命令,然后等待命令回应,然后进行下一个命令,
这样的流程怎样处理比较合适?
我觉得可能用Indy控件比较合适,因为Indy是阻塞的,比如Indy的
TIdTCPConnection就有一个SendCmd函数来完成类似功能,意思是
发送一个命令,并等待得到命令返回结果。但是这种类似的处理方式
有一个前提,就是服务器顺序处理你的命令,并顺序返回你的结果,
如果服务器接收到一个命令后,可能处理时间比较长,而这期间有
消息需要通知客户,那么在该命令返回前,就会返回给客户端这个
需要通知的消息,那么sendcmd函数得到的会不会就是这个消息,
而不是我需要的命令结果?还有,如果我的软件有一个Timer,每隔
一段时间向服务器发送一个查询请求,那么这个Timer查询请求的结果返回
是不是会被前面所说的sendcmd接收到?
类似这样的问题经常遇到,服务器并不一定顺序处理客户端的请求,
并顺序返回结果,客户端用阻塞方式很难做到一问一答的形式。
那么用非阻塞方式的TClientSocket怎么样?这个控件是基于事件驱动
的,有数据过来就激发一个事件,但是这样做问题更多,当事件发生时
(也就是收到返回数据的时候),我怎么知道该进行什么操作?因为
客户端的同一个命令可能在不同的窗口、不同的地点发出的,那么在
TClientSocket.OnRead事件里怎样区分不同的情况做出正确的操作?
另外,我看了一些demo,比如Indy自带的MailClient例子,它就是用的
SendCmd命令来实现交互操作,那么如果在这个例子里面同时存在多个
命令请求(比如Timer里面发出请求),SendCmd函数还能肯定的得到正确的结果吗?
上面的问题我思考了很久,不知道大家是怎样做的?流程处理很烦人。
比如这个软件是一个基于TCP/IP协议的网络聊天软件,程序流程中
经常是 发送一个命令,然后等待命令回应,然后进行下一个命令,
这样的流程怎样处理比较合适?
我觉得可能用Indy控件比较合适,因为Indy是阻塞的,比如Indy的
TIdTCPConnection就有一个SendCmd函数来完成类似功能,意思是
发送一个命令,并等待得到命令返回结果。但是这种类似的处理方式
有一个前提,就是服务器顺序处理你的命令,并顺序返回你的结果,
如果服务器接收到一个命令后,可能处理时间比较长,而这期间有
消息需要通知客户,那么在该命令返回前,就会返回给客户端这个
需要通知的消息,那么sendcmd函数得到的会不会就是这个消息,
而不是我需要的命令结果?还有,如果我的软件有一个Timer,每隔
一段时间向服务器发送一个查询请求,那么这个Timer查询请求的结果返回
是不是会被前面所说的sendcmd接收到?
类似这样的问题经常遇到,服务器并不一定顺序处理客户端的请求,
并顺序返回结果,客户端用阻塞方式很难做到一问一答的形式。
那么用非阻塞方式的TClientSocket怎么样?这个控件是基于事件驱动
的,有数据过来就激发一个事件,但是这样做问题更多,当事件发生时
(也就是收到返回数据的时候),我怎么知道该进行什么操作?因为
客户端的同一个命令可能在不同的窗口、不同的地点发出的,那么在
TClientSocket.OnRead事件里怎样区分不同的情况做出正确的操作?
另外,我看了一些demo,比如Indy自带的MailClient例子,它就是用的
SendCmd命令来实现交互操作,那么如果在这个例子里面同时存在多个
命令请求(比如Timer里面发出请求),SendCmd函数还能肯定的得到正确的结果吗?
上面的问题我思考了很久,不知道大家是怎样做的?流程处理很烦人。