• 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查看完整源码。

  • 相关阅读:
    计算机二进制总结
    java-集合排序,队列,散列表map以及如何遍历
    java-Collection,List简单使用与方法/(集合使用-中)
    java-Date类与集合(上)
    java-正则、object中的两个方法的使用
    java-注释、API之字符串(String)
    Java-面向对象三大特征、设计规则
    java-多态、内部类
    java-修饰词、抽象类、抽象方法
    java-重载、包修饰词以及堆栈管理
  • 原文地址:https://www.cnblogs.com/DKSoft/p/3893452.html
Copyright © 2020-2023  润新知