zoukankan      html  css  js  c++  java
  • DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题

    该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题。

    image

    上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该对象为字符串数据)。

    代码解释:

    procedure TfrmMain.actPushMsgExecute(Sender: TObject);
    var
      lvList:TList;
      i: Integer;
      lvStream:TMemoryStream;
      s:AnsiString;
    begin
      lvList := TList.Create;
      try
        lvStream := TMemoryStream.Create;
        try
          s := edtMsg.Text;
          lvStream.Write(s[1], Length(s));
    
          // 获取所有的在线客户端列表,
          FTcpServer.getOnlineContextList(lvList);
    
    
          // 循环推送到所有的客户端去
    for i := 0 to lvList.Count-1 do
          begin
            //直接推送TMemoryStream对象<内部试用编码器将TStream编码成协议格式,然后发送>
            TIOCPClientContext(lvList[i]).writeObject(lvStream);
          end;
        finally
          lvStream.Free;
        end;
      finally
        lvList.Free;
      end;
    
    end;

    上面为推送按钮的代码

    constructor TfrmMain.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FTcpServer := TIOCPConsole.Create(Self);
      FTcpServer.createDataMonitor;
      FTcpServer.OnDataObjectReceived := OnRecvObject;
    
      // register decoder and encoder class
      FTcpServer.registerCoderClass(TIOCPStreamDecoder, TIOCPStreamEncoder);
      TFMMonitor.createAsChild(pnlMonitor, FTcpServer);
    end;

    上面注册编码和解码器,这样可以在接受数据时和发送数据时,处理对象的转换工作,同时赋值了接收对象事件。

    onRecvObject,如果解码成功一个对象时,会触发一次事件

    procedure TfrmMain.OnRecvObject(pvClientContext: TIocpClientContext;
      pvObject: TObject);
    begin
      pvClientContext.writeObject(pvObject);
    end;

    //上面代码直接把对象推送回客户端。

    客户端代码类似,可以下载socket-coderStreamCoder查看完整源码。

  • 相关阅读:
    linux的lsof命令
    linux find
    linux 查看磁盘空间大小
    eclipse运行时编码设置
    WebService工作原理
    Java获取字符串编码方式
    JavaScript,base64加密解密
    如何用javascript 的eval动态执行一个需要传对象参数的函数
    struts2结果类型
    执行maven-build.cmd失败
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3893452.html
Copyright © 2011-2022 走看看