delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
Indy10发送与接收问题(记录) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214163900127.html
我使用TIDTcpClient及TIdTcpServer,  
  使用ReadLn及WriteLn正常.  
  但是我想发送记录类型,如何做呢?我的实现如下,但没有成功:  
  ------------------------------------------------------------  
  type  
      TUser=record  
          UserName,UserID:String;  
          IP:String;  
          Port:Integer;  
          Msg:String;  
          Arr:Array[1..9]   of   shortString;  
          flag:Boolean;  
          Cmd:String;  
      end;  
  ------------------------------------------------------------  
  实现如下:  
  ------------------------------------------------------------  
  1.使用TidBytes类型:  
  客户:  
    procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
    User:TUser;  
    sby:TidBytes;  
  begin  
    with   user   do  
    begin  
        UserName:='Wyatt';  
        UserID:='7895421';  
        Ip:='192.168.1.188';  
        Port:=9999;  
        Msg:=Edit3.Text;  
        cmd:='Quit';  
    end;  
      sBy:=RawTOBytes(user,sizeof(user));  
      ic1.IOHandler.Write(sBy);  
  end;  
  服务器:  
  procedure   TFrmServer.is1Execute(AContext:   TIdContext);  
  var  
  user:TUser;  
  buf:TidBytes;  
  begin  
    Acontext.Connection.IOHandler.ReadBytes(buf,sizeof(user));  
    BytesToRaw(buf,user,sizeof(user));  
    with   user,memo1.Lines     do  
    begin  
      Add(userName);  
      add(userID);  
      add(ip);  
      add(inttostr(port));  
    end;  
  end;  
  ----------------------------------------------------------------  
  2.使用TStream方法:  
    客户:  
      procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
    User:TUser;  
    Mon:TMemoryStream;  
  begin  
    with   user   do  
    begin  
        UserName:='Wyatt';  
        UserID:='85171659';  
        Ip:='192.168.1.188';  
        Port:=9999;  
        Msg:=Edit3.Text;  
        cmd:='Quit';  
    end;  
    Mon:=TMemoryStream.Create;  
    try  
      Mon.WriteBuffer(user,sizeof(user));  
      ic1.IOHandler.Write(Mon);  
    finally  
      Mon.Free;  
    end;  
  end;  
  服务器:  
    procedure   TFrmServer.is1Execute(AContext:   TIdContext);  
  var  
  user:TUser;  
  Mon:TMemoryStream;  
  begin  
  Mon:=TMemoryStream.Create;  
  try  
      AContext.Connection.IOHandler.ReadStream(Mon);  
      Mon.ReadBuffer(user,Sizeof(user));  
      with   user,memo1.Lines     do  
    begin  
      Add(userName);  
      add(userID);  
      add(ip);  
      add(inttostr(port));  
    end;  
  finally  
      Mon.Free;  
  end;  
  end;  
  以上都不能实现,请高手帮忙解决一下.  
  以上是在delphi2006  
   
  注意一定要Indy10,因为和Indy9不同  
  其中要注意Use   IdContext,IdGlobal这两个单元  
   
 

一个想法    
  先接收成byte   array   然后使用   copyMemory转换

type  
      TUser=record  
          UserName,UserID:String;  
          IP:String;  
          Port:Integer;  
          Msg:String;  
          Arr:Array[1..9]   of   shortString;  
          flag:Boolean;  
          Cmd:String;  
      end;  
  这样定义是有问题的,里面的String会导致包大小计算不对

楼上分析准确,就是这个原因

在Record内不要使用String类型,就算要用,也要用String[254]这种或Array   of   Char

呵,谢谢  
  我改动一个,  
  type  
      TUser=record  
          UserName,UserID:String[20];  
          IP:String[16];  
          Port:Integer;  
          Msg:String[100];  
          Arr:Array[1..9]   of   String[20];  
          flag:Boolean;  
          Cmd:String[20];  
      end;  
  ------------------------  
  使用RawtoBytes及BytesToRaw可以。  
  为何使用Stream收不到呢?  
  另,如果要传送像文件类似的东西,如何定义呢?

自己定义应用协议,数据格式,传输规范  
  例如FTP,HTTP等都是TCP的应用协议

再求,为何使用Stream收不到呢?

posted on 2008-10-28 09:56 delphi2007 阅读(972) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。