indyudp在发送信息的时候为什么都要经过两次接连。。郁闷...(100分)

  • 主题发起人 主题发起人 kkg
  • 开始时间 开始时间
K

kkg

Unregistered / Unconfirmed
GUEST, unregistred user!
那我在写程序的时候!
从客户端发消息给服务器端
如果在有个按纽上写程序那不是要点击两次。。
有什么办法让他按一次服务器就可以接受到呢1·!
 
怎么会点两次呢?一个按扭你就可以了,想写多少代码,谁管你啊
 
我的代码:
客户端:
....
p.. button1.click(...)
begin
inclientudp.send('127.0.0.1',520,'11');
end;

服务器端:
UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
begin
if inServerudp.ReceiveString()='11' then
showmessage(inServerudp.ReceiveString());
end;


为什么每次我要按两次按钮,服务器端才会出现对话框??
 
UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
stmp: string;
begin
stmp := inServerudp.ReceiveString();
if stmp='11' then
showmessage(stmp);

没仔细分析楼主的问题,但估计inServerudp.ReceiveString()是要执行一个读取字符串的操作。对于楼主的代码,在一个过程中,读了两次,因此需要在客户端发两次后,服务端才会显示出对话框。
end;
 
经过我的实践发现在
inserverudp1.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);的是事件中
如果用流来直接从ADATA中接受数据就不会有问题

要是用inServerudp.ReceiveString();
就会要进行两次连接

 
楼主的实践是有道理的。
客户端按一次按钮,触发inserverudp1.UDPServerUDPRead,此时数据已经被存放在AData中,用一次receivestring应该是从AData中取数据,但第二次再用receivestring时,AData中已经没有新的数据,所以需要客户端再次按钮才可以。
 
armyjiang朋友

你有用INDYUDP实现传送文件吗??

可以给我一点提示吗?
 
没用过indyudp控件,但是传送的思路和delphi的demo中的例子是一致的。
应该没什么太大的问题,而且我觉得indy的控件组应该有这样的例子的。
6中有一个发送消息的例子,稍微改写一下就是一个发文件的例子。
 
用indyudp好想要写一个专门的线程来处理接受的消息,
要不然就会死掉。
服务器端:
放一个EDIT1;
inserverudp1.UDPServerUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var stream:tstringstream;
s:string;
begin
stream:=tstringstream.create('');
stream.copyfrom(adata,adata.size);
edit1.text1:=stream.datastring;
s:='aaaaa';
abinding.sendto(abinding.peerip,abinding.peerport,s[1],length(s));
end;

客户端:
放一个EDIT2;
procedure button1.buttonclick(Sender: TObject);
var s:string;
begin
inclientudp.send('127.0.0.1',520,'11');
try
s:=inclentudp.ReceiveString();
edit2.text:=s;
expect
end;
end;

执行上面这端程序就会死掉



 
后退
顶部