Delphi Indy 10断开问题

Delphi Indy 10断开问题,delphi,tcp,client,indy,indy10,Delphi,Tcp,Client,Indy,Indy10,我在做什么: 我的服务器通过上下文列表发送数据,在它锁定到特定的客户机之后,它发送该客户机数据,并且它期望我们在这个连接计时器中处理的回复。 我知道使用线程将是一个更好的方法,但这是我的选择 我的问题是: 我请求获取连接信息,它工作正常,套接字将getstring数据1到8写入行 但是,当我写“Hello”时,它不会响应任何数据,它只是断开了客户端的连接 任何帮助都将不胜感激,因为我已经花了2天左右的时间试图解决这个问题。 提前谢谢 这是我的密码: procedure TForm1.Comman

我在做什么: 我的服务器通过上下文列表发送数据,在它锁定到特定的客户机之后,它发送该客户机数据,并且它期望我们在这个连接计时器中处理的回复。 我知道使用线程将是一个更好的方法,但这是我的选择

我的问题是: 我请求获取连接信息,它工作正常,套接字将getstring数据1到8写入行 但是,当我写“Hello”时,它不会响应任何数据,它只是断开了客户端的连接

任何帮助都将不胜感激,因为我已经花了2天左右的时间试图解决这个问题。 提前谢谢

这是我的密码:

procedure TForm1.CommandTimerTimer(Sender: TObject);
var
sl:Tstringlist;
Command: String;
begin
  if clientsocket.IOHandler.InputBufferIsEmpty then
  begin
    clientsocket.IOHandler.CheckForDataOnSource(10);
    if clientsocket.IOHandler.InputBufferIsEmpty then Exit;
  end;
  Command := clientsocket.IOHandler.ReadLn();
  sl:= Tstringlist.Create;
  sl.Delimiter:= '|';
  sl.StrictDelimiter:=true;
  sl.DelimitedText:= Command;
  if sl[0] = 'did i get data' then
  begin
   showmessage('Yea I got Data');
  end;


if sl[0] = 'BroadCasted Message' then
begin
Clientsocket.IOHandler.write('data');
showmessage(sl[1]); // This is data sent from my server to this client, in order to manage the data I have created a Tstringlist and delimited it out by '|'. 
end;
if sl[0] = 'hello' then
begin
  clientsocket.IOHandler.write('data');
end;
if sl[0] = 'Get Connection Info' then
begin
// This part
clientsocket.IOHandler.writeln('Newconnection' + '|' + 'string data 1'  + '|' + 'string data 2' + '|' + 'string data 3' + '|'+ 'string data 4'+'|' + 'string data 5'+'|'+'string data 6'+'|'+'string data 7'+'|'+'string data 8');
end;

if sl[0] = 'Reconnect' then
begin
commandtimer.Enabled:=false;
Connectiontimer.Enabled:=true; // This is a timer that constantly checks and keeps the TidTCPclientsocket connected with my server as this is a Reverse connection Protocol.
Exit;
end;
commandtimer.enabled:=true;
end;

雷米谢谢你的快速回复,我的朋友和我正在一起做这个项目,在发布这个问题后不久,我们都很快确定了我们存在的真实问题,并且我们已经解决了它

任何需要它的人的固定代码:

客户端:(Tidtcpclient)

我希望这个例子能帮助其他在使用indy sockets时遇到随机断开问题的人,lol通常是程序员的错,而不是他或她选择使用的组件集

我很抱歉,如果这个示例代码不可读,这是我第一次在这个网站上发布,我相信在未来的帖子中,我会努力正确格式化我的评论等。。。等等

此外,我还想为任何试图在客户端接收此类数据的人补充一点,即最好创建自己的后台工作线程,以侦听来自TidTCPserver套接字的传入连接。我知道定时器是一种糟糕的编程实践,事实上,我和我的朋友很快就会将其切换到一个单独的线程


雷米再次感谢你的快速回复!非常感谢,先生。

您正在使用
WriteLn()
进行
“获取连接信息”
回复,但在其他回复中使用
Write()
。服务器是否期望在每个回复上都有换行符?我知道这个评论很晚了,lol,但是是的,代码是crud,只是为了解决这个问题,我们的实际代码要好得多,我们在最终产品中使用了线程保存队列列表和各种各样的东西:)
     procedure TForm1.CommandTimerTimer(Sender: TObject);
        var
        sl:Tstringlist;
        Command: String;
        begin
            if clientsocket.IOHandler.InputBufferIsEmpty then
        begin
            clientsocket.IOHandler.CheckForDataOnSource(10);
            if clientsocket.IOHandler.InputBufferIsEmpty then Exit;
          end;
          Command := clientsocket.IOHandler.ReadLn();
          sl:= Tstringlist.Create;
          sl.Delimiter:= '|';
          sl.StrictDelimiter:=true;
          sl.DelimitedText:= Command;
          if sl[0] = 'Get Connection Info' then
          begin
      clientsocket.IOHandler.writeln('String Data 1' + '|' + 'String Data 2'+ '|' + 'String     Data 3'+ '|' + 'String Data 4' + '|'+ 'String Data 5'+'|' + 'String Data 6'+'|'+'String Data 7'+'|'+'String Data 8'+'|'+'String Data 9' + '|' + 'String Data 10' + '|' + 'String Data 11');
end
else
if sl[0] = 'hello' then
begin
showmessage('I got Hello');
clientsocket.IOHandler.writeln('Some Data');
end;
if sl[0] = 'PING!' then
begin
clientsocket.IOHandler.WriteLn('PINGBACK!');
end;

commandtimer.enabled:=true;
end;

Server Side: (TidTCPserver) OnExecute Event Procedure

procedure TForm1.ServersocketExecute(AContext: TIdContext);
Var
sl:Tstringlist;
listitem:Tlistitem;  // This is for a Tlistview where we are adding connection information
Data:String;
Begin
data:= acontext.connection.iohandler.readln(); 
sl:= Tstringlist.create;
sl.delimiter:= '|';
sl.delimitedtext:= data;

    If sl[0] = 'String Data 1' then
begin
listitem:= listview1.items.add;
listitem.caption:= acontext.binding.peerip;
listitem.subitems.add(sl[2]);
listitem.subitems.add(sl[3]);
listitem.subitems.add(sl[4]);
listitem.subitems.add(sl[5]);
listitem.subitems.add(sl[6]);
listitem.subitems.add(sl[7]);
listitem.subitems.add(sl[8]);
listitem.subitems.add(sl[9]);
listitem.subitems.add(sl[10]);

after we add items to the listview component we then go into our own ping method.

Allow me to show everyone what the problem was: 

we recived commands based on the FIRST string received by the clientsocket IE:

If sl[0] = 'Command sent by Client' then
begin

end;

and we kept it going on and on and on IE: 

If sl[0] = 'Command sent by Client' then
begin

end;
If sl[0] = 'Command sent by Client' then
begin

end;

The problem with this is that we cannot allow this code to run on and on like this otherwise the socket hangs and disconnects.

The fix was Simple   Example:

If sl[0] = 'Command sent by Client' then
begin
// Do what we have to do in this instance of receiving a Command and then Exit the sub / Procedure.
exit;
end;

If sl[0] = 'Command sent by Client' then
begin
// do what we got to do in here
Exit; // DON'T forget the exit statement or code runs on and will hang the socket. 
end;