- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 UDP 协议(protocol)通过 synapse 创建服务器和客户端程序。
我已经创建了服务器程序来监听任何类似这样的消息
procedure TForm1.Timer1Timer(Sender: TObject);
var
resive:string;
begin
InitSocket;
resive:=UDPResiveSocket.RecvPacket(1000);
if resive<>'' then Memo1.Lines.Add('>' + resive);
DeInitSocket;
end;
procedure TForm1.InitSocket;
begin
if UDPResiveSocket <> nil then
DeInitSocket;
UDPResiveSocket := TUDPBlockSocket.Create;
UDPResiveSocket.CreateSocket;
UDPResiveSocket.Bind('0.0.0.0','22401');
UDPResiveSocket.AddMulticast('234.5.6.7');
UDPResiveSocket.MulticastTTL := 1;
end;
procedure TForm1.DeInitSocket;
begin
UDPResiveSocket.CloseSocket;
UDPResiveSocket.Free;
UDPResiveSocket := nil;
end;
所以我收到了所有传入的消息。但我想从该消息的来源发送响应。
我怎样才能做到这一点?我的方法适合服务器/客户端吗?
最佳答案
我的 UDP Echo 客户端/服务器代码。首先是服务器:
unit UE_Server;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils,
// synapse
blcksock;
type
{ TUEServerThread }
TUEServerThread = class(TThread)
protected
procedure Execute; override;
end;
TUEServer = class
private
FUEServerThread: TUEServerThread;
function GetRunning: Boolean;
public
procedure Stop;
procedure Start;
property Running: Boolean read GetRunning;
end;
implementation
{ TUEServer }
function TUEServer.GetRunning: Boolean;
begin
Result := FUEServerThread <> nil;
end;
procedure TUEServer.Start;
begin
FUEServerThread := TUEServerThread.Create(False);
end;
procedure TUEServer.Stop;
begin
if FUEServerThread <> nil then
begin
FUEServerThread.Terminate;
FUEServerThread.WaitFor;
FreeAndNil(FUEServerThread);
end;
end;
{ TUEServerThread }
procedure TUEServerThread.Execute;
var
Socket: TUDPBlockSocket;
Buffer: string;
Size: Integer;
begin
Socket := TUDPBlockSocket.Create;
try
Socket.Bind('0.0.0.0', '7');
try
if Socket.LastError <> 0 then
begin
raise Exception.CreateFmt('Bind failed with error code %d', [Socket.LastError]);
Exit;
end;
while not Terminated do
begin
// wait one second for new packet
Buffer := Socket.RecvPacket(1000);
if Socket.LastError = 0 then
begin
// just send the same packet back
Socket.SendString(Buffer);
end;
// minimal sleep
if Buffer = '' then
Sleep(10);
end;
finally
Socket.CloseSocket;
end;
finally
Socket.Free;
end;
end;
end.
然后客户端:
unit UE_Client;
{$mode objfpc}{$H+}
interface
uses
{$IFDEF WINDOWS}Windows,{$ENDIF}Classes, SysUtils, DateUtils,
// synapse
blcksock;
const
cReceiveTimeout = 2000;
cBatchSize = 100;
type
{ TUEClient }
TUEClient = class
private
FSocket: TUDPBlockSocket;
FResponseTime: Int64;
public
constructor Create;
destructor Destroy; override;
procedure Disconnect;
function Connect(const Address: string): Boolean;
function SendEcho(const Message: string): string;
property ReponseTime: Int64 read FResponseTime;
end;
{ TUEAnalyzer }
{ TUEAnalyzerThread }
TUEAnalyzerThread = class(TThread)
private
FAddress: string;
FBatchDelay: Cardinal;
FDropedPackets: Cardinal;
FAverageResponse: Extended;
FCriticalSection: TRTLCriticalSection;
function GetAverageResponse: Extended;
function GetDropedPackets: Cardinal;
protected
procedure Execute; override;
public
destructor Destroy; override;
constructor Create(const Address: string; const BatchDelay: Cardinal);
property DropedPackets: Cardinal read GetDropedPackets;
property AverageResponse: Extended read GetAverageResponse;
end;
TUEAnalyzer = class
private
FAddress: string;
FBatchDelay: Cardinal;
FAnalyzerThread: TUEAnalyzerThread;
function GetAverageResponse: Extended;
function GetDropedPackets: Cardinal;
function GetRunning: Boolean;
public
procedure StopAnalyzer;
procedure StartAnalyzer;
property Running: Boolean read GetRunning;
property Address: string read FAddress write FAddress;
property DropedPackets: Cardinal read GetDropedPackets;
property AverageResponse: Extended read GetAverageResponse;
property BatchDelay: Cardinal read FBatchDelay write FBatchDelay;
end;
implementation
{ TUEAnalyzerThread }
function TUEAnalyzerThread.GetAverageResponse: Extended;
begin
EnterCriticalsection(FCriticalSection);
try
Result := FAverageResponse;
finally
LeaveCriticalsection(FCriticalSection);
end;
end;
function TUEAnalyzerThread.GetDropedPackets: Cardinal;
begin
EnterCriticalsection(FCriticalSection);
try
Result := FDropedPackets;
finally
LeaveCriticalsection(FCriticalSection);
end;
end;
procedure TUEAnalyzerThread.Execute;
var
UEClient: TUEClient;
Connected: Boolean;
SendString: string;
SendCounter: Int64;
SumResponse: Cardinal;
SumDropedPackets: Cardinal;
begin
UEClient := TUEClient.Create;
try
Connected := UEClient.Connect(FAddress);
try
if not Connected then
begin
raise Exception.CreateFmt('Could not connect UPD client to address %s', [FAddress]);
Exit;
end;
SumDropedPackets := 0;
FAverageResponse := 0;
FDropedPackets := 0;
SumResponse := 0;
SendCounter := 1;
while not Terminated do
begin
SendString := IntToStr(SendCounter);
if not (UEClient.SendEcho(SendString) = SendString) then
Inc(SumDropedPackets);
Inc(SumResponse, UEClient.ReponseTime);
Inc(SendCounter);
if (SendCounter mod cBatchSize) = 0 then
begin
EnterCriticalsection(FCriticalSection);
try
FAverageResponse := SumResponse / cBatchSize;
FDropedPackets := SumDropedPackets;
finally
LeaveCriticalsection(FCriticalSection);
end;
// sleep for specified batch time
Sleep(FBatchDelay * 1000);
SumDropedPackets := 0;
SumResponse := 0;
end;
// minimal sleep
Sleep(10);
end;
finally
UEClient.Disconnect;
end;
finally
UEClient.Free;
end;
end;
destructor TUEAnalyzerThread.Destroy;
begin
{$IFDEF MSWINDOWS}
DeleteCriticalSection(FCriticalSection)
{$ELSE}
DoneCriticalSection(FCriticalSection)
{$ENDIF};
inherited Destroy;
end;
constructor TUEAnalyzerThread.Create(const Address: string; const BatchDelay: Cardinal);
begin
{$IFDEF MSWINDOWS}
InitializeCriticalSection(FCriticalSection)
{$ELSE}
InitCriticalSection(FCriticalSection)
{$ENDIF};
FBatchDelay := BatchDelay;
FreeOnTerminate := True;
FAddress := Address;
inherited Create(False);
end;
{ TUEAnalyzer }
procedure TUEAnalyzer.StartAnalyzer;
begin
FAnalyzerThread := TUEAnalyzerThread.Create(FAddress, FBatchDelay);
end;
function TUEAnalyzer.GetRunning: Boolean;
begin
Result := FAnalyzerThread <> nil;
end;
function TUEAnalyzer.GetAverageResponse: Extended;
begin
Result := FAnalyzerThread.AverageResponse;
end;
function TUEAnalyzer.GetDropedPackets: Cardinal;
begin
Result := FAnalyzerThread.DropedPackets;
end;
procedure TUEAnalyzer.StopAnalyzer;
begin
if Running then
begin
FAnalyzerThread.Terminate;
FAnalyzerThread := nil;
end;
end;
{ TUEClient }
constructor TUEClient.Create;
begin
FSocket := TUDPBlockSocket.Create;
end;
destructor TUEClient.Destroy;
begin
FreeAndNil(FSocket);
inherited Destroy;
end;
procedure TUEClient.Disconnect;
begin
FSocket.CloseSocket;
end;
function TUEClient.Connect(const Address: string): Boolean;
begin
FSocket.Connect(Address, '7');
Result := FSocket.LastError = 0;
end;
function TUEClient.SendEcho(const Message: string): string;
var
StartTime: TDateTime;
begin
Result := '';
StartTime := Now;
FSocket.SendString(Message);
if FSocket.LastError = 0 then
begin
Result := FSocket.RecvPacket(cReceiveTimeout);
FResponseTime := MilliSecondsBetween(Now, StartTime);
if FSocket.LastError <> 0 then
begin
FResponseTime := -1;
Result := '';
end;
end;
end;
end.
该代码是用 free pascal 编写的,但在 Delphi 中同样可以很好地工作。客户端单元实际上是一个线路分析器,用于计算平均响应时间和丢弃的数据包。检查特定服务器的互联网线路质量是理想的选择。您将 echo 服务器放在服务器部分,将客户端放在客户端。
关于Delphi Synapse UDP 客户端/服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9786011/
当存储帐户访问 key 被禁用时,Dataverse 的突触链接运行正常。我们可以创建新记录,这里没有问题。但当存储帐户 key 被禁用时,它无法为 Dataverse 设置新的突触链接。有人以前见过
是否有计划支持专用池的开放行集?优点: 比外部文件格式更多(更快)的解析器选项,例如行分隔符 可以自动推断模式 直接定义文件格式更方便 最佳答案 这是一个很棒的功能请求,安德斯。我看到您已经创建了一个
我有一个天蓝色的突触工作区,其中包含无服务器 SQL 池中的许多管道和外部表。所有这些都与一个特定项目相关。 还有另外 2-3 个完全独立的项目正在进行中,需要突触工具集。 我应该创建一个新的工作区,
我有一个天蓝色的突触工作区,其中包含无服务器 SQL 池中的许多管道和外部表。所有这些都与一个特定项目相关。 还有另外 2-3 个完全独立的项目正在进行中,需要突触工具集。 我应该创建一个新的工作区,
能否请您帮助我在 Azure Synapse 中使用 FOR XML PATH。如果不是,还有什么选择。 谢谢 最佳答案 如果您希望使用 FOR XML 来准备,例如动态数据透视查询的列名,那么 st
编辑:这是一个连接到 git 存储库的工作区。如果我向处于“实时”模式的工作区添加触发器,触发器将显示。如何将触发器添加到设置到 git 存储库的工作区? 使用 Azure Synapse,我在创建和
我在 AzureSynapse 无服务器池中定义了一个 View ,它使用 openrowset 获取数据。我在专用 sql 池中的表中也有数据。 我可以做一个连接这两个表的 sql 查询吗? 最佳答
我在 Synapse 工作区中有一个主管道,其中有 2 个事件: 第一 - 笔记本事件 第二 - If 条件事件 对于第一个(Synapse 笔记本、spark 池、pyspark),我有一个如下所示
我在 Synapse 工作区中有一个主管道,其中有 2 个事件: 第一 - 笔记本事件 第二 - If 条件事件 对于第一个(Synapse 笔记本、spark 池、pyspark),我有一个如下所示
我们将从本地迁移到 Azure,并将使用 Azure Synapse。我们的转换主要是从 SQL 存储过程的直接迁移开始。 查看高级文档,我没有发现 ADF 和 Azure Synapse Pipel
最近,我们将专用 SQL 池部署到生产中的 Synapse 工作区。在开发中,我们可以访问无服务器 SQL 池和专用 SQL 池。但是,在生产中,我们可以访问无服务器 SQL 池,但无法访问专用 SQ
我正在尝试克隆 Synapse Serverless SQL 数据库,以便可以使用它进行测试。 当我在 Synapse Studio 中单击 SQL 数据库时,没有克隆选项。 No 'Clone' o
我正在尝试克隆 Synapse Serverless SQL 数据库,以便可以使用它进行测试。 当我在 Synapse Studio 中单击 SQL 数据库时,没有克隆选项。 No 'Clone' o
根据Doc。这是否意味着,目前数据库设计器不支持Delta格式来可视化地创建Lake数据库表?
以下 Azure 服务之间有什么区别? Azure Synapse Analytics(以前称为 SQL DW) Azure Synapse Analytics(专用链接中心预览版) Azure Sy
以下 Azure 服务之间有什么区别? Azure Synapse Analytics(以前称为 SQL DW) Azure Synapse Analytics(专用链接中心预览版) Azure Sy
我正在尝试使用 Synapse Pipelines 中的 Notebook Activity 执行 Azure Synapse Notebook,它在调试 Pipelines 时不断出现错误,Note
我有一个表,由于名称列中的差异,它为相同的ID返回多个行。有些名字在名字后面加上中间字母,或者在姓氏后面加上后缀。在下面的示例中,我只想要第一行,因为它有完整的名称。。我尝试按名称长度进行排名,但因未
我有一个表,由于名称列中的差异,它为相同的ID返回多个行。有些名字在名字后面加上中间字母,或者在姓氏后面加上后缀。在下面的示例中,我只想要第一行,因为它有完整的名称。。我尝试按名称长度进行排名,但因未
我们在目录和订阅(我们将其称为目录_1 和订阅_1)下有不同的资源(存储帐户、逻辑应用、SQL 数据库、SQL Server、Synapse 工作区) 这些资源用于执行简单的 ETL 管道。 我们希望
我是一名优秀的程序员,十分优秀!