使用 TIdTCPClient 发送消息时,总不是立即发送出去?只有断开连接时才发送???(100)

  • 主题发起人 主题发起人 WebBar
  • 开始时间 开始时间
W

WebBar

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用以下方式进行文本发送,可是每次发送后,服务端是没有任何响应的。但是当我客户端断开连接时,服务端事件却马上响应了。IdTCPClient1->Socket->Write(m_Context);分析可能是执行Write之后,IdTCPClient1只是把报文存放在缓存中,可能要等到缓存较满时才发送,或就是连接关闭时才发送,所以产生了以上现象。以往我的解决方案是每次发送完断开链接,但这次不能这么处理,请教是否有什么代码可以强制IdTCPClient1立即进行发送操作呢?
 
那其实是你服务端的问题.并不是客户端问题.
 
此话怎讲??
 
最好是发你的服务端接收的那一段代码看看.因为Indy组件是线程阻塞的.如果服务端认为没有读到指定的数据会一直等待.比方你客户端发的数据如果是 1024 的字节的数据包.那在服务端读的时侯就要指定服务端读这 1024的字节的内容.否则如果你指定要读 1025个字节.那他就一直等下去.直到客户端断开他才会退出阻塞线程.意思就是说.你发的如果是一个结构体.那服务端每次读的时侯就一定要读这个结构体大小的内容.
 
我发的只是字符串哦。
 
你是不是用ReadStream(AStream: TStream; AByteCount: Integer = -1; const AReadUntilDisconnect: boolean = false)来读取数据的啊如果是,请注意最后一个参数AReadUntilDisconnect在这个参数为True的情况下,就是连接断开后才收完数据
 
没有为方法指定第三个参数。是默认的
 
字符串的话你不方便指定长度.Indy9提供了.以行来进行读写字符串.好像 WriteLn 和 ReadLn 主要是根据字符串的结束符号做为依据.当读到以行结尾的标志.他就认为已经接收完所要的内容.否则就一直等待.
 
大家继续猜。。楼主的代码是个宝,不能贴出来的。
 
读和写的两段代码不是已经在上面了嘛
 
IdTCPClient1WriteBuffer(const ABuffer; AByteCount: Integer; const AWriteNow: boolean = false)AWriteNow这个参数为true会立即发送。
 
后退
顶部