Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1267194
  • 博文数量: 788
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 7005
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 15:52
文章存档

2017年(81)

2011年(1)

2009年(369)

2008年(337)

分类:

2008-10-28 10:00:09



我使用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收不到呢?



[新闻]Facebook开放Scribe源代码 改善运行效率
博客园首页 社区 新闻频道 小组 博问 网摘 闪存
阅读(1140) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~