\t\t【原创】TROSynapseTCPChannel通讯管道,可替换TROIndyTCPChannel

本文介绍了一个使用Synapse库实现的TCP通道组件TROSynapseTCPChannel,该组件旨在替代原有的Indy库实现,提供了更快的连接速度和更简洁的接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Indy由于版本过多,接口混乱,而且Synapse连接速度比Indy快很多,因此早想使用Synapse做一个TCP的Channel替换掉TROIndyTCPChannel。例子稍后几天补上,并提供测试对比数据。如果你有新的完善可以共享的话,请发到我邮箱里!

TROSynapseTCPChannel源码如下:

unit uROSynpaseTCPChannel;

interface
uses Classes, uROClient, {IdBaseComponent,} uROClientIntf, blcksock, synsock;

type
TSynapseClient = class(TTCPBlockSocket)
private
     FConnected: Boolean;
protected
     procedure DoStatus(Reason: THookSocketReason; const Value: string);override;
published
     property Connected:Boolean read FConnected default False;
end;
{ TROCustomIndyTCPChannel }
TROCustomSynapseTCPChannel = class(TROTransportChannel, IROTransport, IROTCPTransport)
private
    fSynapseClient : TSynapseClient;
    fKeepAlive: boolean;
    fDisableNagle: boolean;
    FConnectTimeout: Integer;
    FConnectFromIndy: Boolean;
    FPort: integer;
    FHost: string;
    FUsingIP6: Boolean;
    FRecvTimeout: Integer;
    FSendTimeout: Integer;

    procedure SetHost(const Value: string);
    procedure SetPort(const Value: integer);
    procedure SetConnectTimeout(const Value: Integer);
    procedure SetConnectFromIndy(const Value: Boolean);
    function GetHost: string;
    function GetPort: integer;
    procedure SetUsingIP6(const Value: Boolean);
    procedure SetRecvTimeout(const Value: Integer);
    procedure SetSendTimeout(const Value: Integer);

protected
    procedure IntDispatch(aRequest, aResponse : TStream); override;
    procedure IntSetServerLocator(aServerLocator : TROServerLocator); override;

    function CreateSynapseClient: TSynapseClient; virtual;

    { IROTransport }
    function GetTransportObject : TObject; override;

    { IROTCPTransport }
    function GetClientAddress : string;

public
    constructor Create(aOwner : TComponent); override;

    property Port : integer read FPort write SetPort;
    property Host : string read FHost write SetHost;
    property DisableNagle : boolean read fDisableNagle write fDisableNagle default FALSE;
    property SynapseClient : TSynapseClient read fSynapseClient;
    property KeepAlive : boolean read fKeepAlive write fKeepAlive default false;
    property ConnectTimeout:Integer read FConnectTimeout write SetConnectTimeout;
    property RecvTimeout:Integer read FRecvTimeout write SetRecvTimeout;
    property SendTimeout:Integer read FSendTimeout write SetSendTimeout;
    property ConnectFromIndy:Boolean read FConnectFromIndy write SetConnectFromIndy default False;
    property UsingIP6:Boolean read FUsingIP6 write SetUsingIP6 default False;
published
    property SynchronizedProbing;
    property OnSendStream;
    property OnReceiveStream;
    property ServerLocators;
    property DispatchOptions;
    property OnServerLocatorAssignment;
    property ProbeServers;
    property ProbeFrequency;
    property OnBeforeProbingServers;
    property OnAfterProbingServers;
    property OnBeforeProbingServer;
    property OnAfterProbingServer;
    property OnLoginNeeded;
end;

{ TROIndyTCPChannel }
TROSynapseTCPChannel = class(TROCustomSynapseTCPChannel, IROTransport, IROTCPTransport)
private
protected

published
    property Port;
    property Host;
    property DisableNagle;
    property SynapseClient;
    property KeepAlive;
    property ConnectTimeout;
    property RecvTimeout;
    property SendTimeout;
end;

implementation

uses
SysUtils, uROClasses;

{ TROCustomIndyTCPChannel }

constructor TROCustomSynapseTCPChannel.Create(aOwner: TComponent);
begin
inherited;
fSynapseClient := CreateSynapseClient;
//fSynapseClient.Name := 'InternalSynapseClient';
//
// {$IFDEF DELPHI6UP}
// fSynapseClient.SetSubComponent(TRUE);
// {$ENDIF}
FUsingIP6 := False;
FSynapseClient.Family := SF_IP4;
FConnectFromIndy := False;
FConnectTimeout := 10000;
FSendTimeout := 15000;
FRecvTimeout := 60000;
fKeepAlive := True;
end;

function TROCustomSynapseTCPChannel.CreateSynapseClient: TSynapseClient;
begin
result := TSynapseClient.Create;
TSynapseClient(result).Bind('127.0.0.1','8090');
end;

function TROCustomSynapseTCPChannel.GetClientAddress: string;
begin
Result :=   fSynapseClient.GetLocalSinIP;
end;

function TROCustomSynapseTCPChannel.GetTransportObject: TObject;
begin
result := Self;
end;

procedure TROCustomSynapseTCPChannel.IntSetServerLocator(
aServerLocator: TROServerLocator);
begin
Host := aServerLocator.Host;
Port := aServerLocator.Port;
end;

procedure TROCustomSynapseTCPChannel.IntDispatch(aRequest, aResponse: TStream);
begin
try
    if not fSynapseClient.Connected then
      fSynapseClient.Connect(FHost,IntToStr(FPort));

    if FConnectFromIndy then
    begin
      aRequest.Position := 0;
      fSynapseClient.SendStreamIndy(aRequest);
      fSynapseClient.RecvStreamIndy(aResponse,FRecvTimeout);
      aResponse.Position := 0;
    end
    else
    begin
      aRequest.Position := 0;
      fSynapseClient.SendStream(aRequest);
      fSynapseClient.RecvStream(aResponse,FRecvTimeout);
      aResponse.Position := 0;
    end;
finally
    if not KeepAlive then
      fSynapseClient.CloseSocket;
end;
end;

function TROCustomSynapseTCPChannel.GetHost: string;
begin
result := TSynapseClient(SynapseClient).GetRemoteSinIP;
end;

function TROCustomSynapseTCPChannel.GetPort: integer;
begin
result := TSynapseClient(SynapseClient).GetRemoteSinPort;
end;

procedure TROCustomSynapseTCPChannel.SetConnectFromIndy(const Value: Boolean);
begin
FConnectFromIndy := Value;
end;

procedure TROCustomSynapseTCPChannel.SetConnectTimeout(const Value: Integer);
begin
FConnectTimeout := Value;
fSynapseClient.SetTimeout(FConnectTimeout);
end;

procedure TROCustomSynapseTCPChannel.SetHost(const Value: string);
begin
FHost := Value;
fSynapseClient.Bind(Host,IntToStr(FPort));
end;

procedure TROCustomSynapseTCPChannel.SetPort(const Value: integer);
begin
FPort := Value;
fSynapseClient.Bind(Host,IntToStr(FPort));
end;

procedure TROCustomSynapseTCPChannel.SetRecvTimeout(const Value: Integer);
begin
FRecvTimeout := Value;
end;

procedure TROCustomSynapseTCPChannel.SetSendTimeout(const Value: Integer);
begin
FSendTimeout := Value;
fSynapseClient.SetSendTimeout(FSendTimeout);
end;

procedure TROCustomSynapseTCPChannel.SetUsingIP6(const Value: Boolean);
begin
FUsingIP6 := Value;
if FUsingIP6 then
    FSynapseClient.Family := SF_IP6
else
    FSynapseClient.Family := SF_IP4;
end;

{ TSynapseClient }

procedure TSynapseClient.DoStatus(Reason: THookSocketReason;
const Value: string);
begin
inherited;
FConnected := (Reason in [HR_Connect,HR_CanRead,HR_CanWrite,HR_Accept,
                            HR_WriteCount,HR_ReadCount,HR_Listen]);
// FConnected := not (Reason in [HR_Error,HR_SocketClose,HR_SocketCreate]);
end;

initialization
RegisterTransportChannelClass(TROSynapseTCPChannel);

finalization
UnRegisterTransportChannelClass(TROSynapseTCPChannel);

end.

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 在本文中,我们将探讨如何通过 Vue.js 实现一个带有动画效果的“回到顶部”功能。Vue.js 是一款用于构建用户界面的流行 JavaScript 框架,其组件化和响应式设计让实现这种交互功能变得十分便捷。 首先,我们来分析 HTML 代码。在这个示例中,存在一个 ID 为 back-to-top 的 div 元素,其中包含两个 span 标签,分别显示“回到”和“顶部”文字。该 div 元素绑定了 Vue.js 的 @click 事件处理器 backToTop,用于处理点击事件,同时还绑定了 v-show 指令来控制按钮的显示与隐藏。v-cloak 指令的作用是在 Vue 实例渲染完成之前隐藏该元素,避免出现闪烁现象。 CSS 部分(backTop.css)主要负责样式设计。它首先清除了一些默认的边距和填充,对 html 和 body 进行了全屏布局,并设置了相对定位。.back-to-top 类则定义了“回到顶部”按钮的样式,包括其位置、圆角、阴影、填充以及悬停时背景颜色的变化。此外,与 v-cloak 相关的 CSS 确保在 Vue 实例加载过程中隐藏该元素。每个 .page 类代表一个页面,每个页面的高度设置为 400px,用于模拟多页面的滚动效果。 接下来是 JavaScript 部分(backTop.js)。在这里,我们创建了一个 Vue 实例。实例的 el 属性指定 Vue 将挂载到的 DOM 元素(#back-to-top)。data 对象中包含三个属性:backTopShow 用于控制按钮的显示状态;backTopAllow 用于防止用户快速连续点击;backSeconds 定义了回到顶部所需的时间;showPx 则规定了滚动多少像素后显示“回到顶部”按钮。 在 V
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值