Indy TCP套接字可以在两个线程之间共享吗?

马鲁斯·尼布奴

我想要一个连接,两个终端都在等待读取命令,并且一个终端不时地向另一个终端发送一些数据。当然,我知道如何实现协议,但是如果执行该协议,Socket.ReadUInt32它将阻塞我的执行路径,并且无法在需要时发送命令。所以我想,如果我使用相同的套接字从另一个线程发送命令怎么办?我写了一个最小的例子……似乎可行。但是我不确定这是否是正确的方法,或者这一次真是不走运……这种技术是线程安全的吗?额外的线程将仅使用套接字发送UInt32值,唤醒另一端,然后,连接将在主线程中进行。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdTCPConnection,
  IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
  IdContext, IdThreadComponent;

const
  WM_LOGEVENT = WM_USER + 1;

type
  TForm1 = class(TForm)
    Server: TIdTCPServer;
    Client: TIdTCPClient;
    BStartServer: TButton;
    BConnectClient: TButton;
    ClientWriteThread: TIdThreadComponent;
    Memo: TMemo;
    BSendCommand: TButton;
    ClientReadThread: TIdThreadComponent;
    procedure BStartServerClick(Sender: TObject);
    procedure ServerExecute(AContext: TIdContext);
    procedure BConnectClientClick(Sender: TObject);
    procedure ClientWriteThreadRun(Sender: TIdThreadComponent);
    procedure BSendCommandClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ClientReadThreadRun(Sender: TIdThreadComponent);
  private
    procedure LogEvent(var Msg: TMessage); message WM_LOGEVENT;
    procedure SendEvent(const Msg: String);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.LogEvent(var Msg: TMessage);
var PStr: PString;
begin
 PStr:= PString(Msg.WParam);
 Memo.Lines.Add(Copy(PStr^, 1, Length(PStr^)));
end;

procedure TForm1.SendEvent(const Msg: String);
begin
 SendMessage(Handle, WM_LOGEVENT, WPARAM(@Msg), 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Server.Bindings.Clear;
 Server.Bindings.Add.SetBinding('192.168.0.3', 60200);
 Client.Host:= '192.168.0.3';
 Client.Port:= 60200;
end;

procedure TForm1.BStartServerClick(Sender: TObject);
begin
 Server.Active:= True;
 Caption:= IntToStr(Byte(Server.Active));
end;

procedure TForm1.BConnectClientClick(Sender: TObject);
begin
 Client.Connect;
 ClientReadThread.Start;
end;

procedure TForm1.BSendCommandClick(Sender: TObject);
begin
 ClientWriteThread.Start;
end;

procedure TForm1.ClientWriteThreadRun(Sender: TIdThreadComponent);
var Data: Cardinal;
begin
 Data:= 1234;
 SendEvent('Client send: '+ IntToStr(Data));
 Client.Socket.Write(Data);
 Sender.Terminate;
end;

procedure TForm1.ClientReadThreadRun(Sender: TIdThreadComponent);
var Data: Cardinal;
begin
 SendEvent('Client listening...');
 Data:= Client.Socket.ReadUInt32;
 SendEvent('Client received: '+ IntToStr(Data));

 Client.Disconnect;
 SendEvent('Client stopped.');
 Sender.Terminate;
end;

procedure TForm1.ServerExecute(AContext: TIdContext);
var Data: Cardinal;
    Srv: String;
begin
 Srv:= 'Server '+IntToStr(Random(100));
 SendEvent(Srv+' listening...');
 Data:= AContext.Connection.Socket.ReadUInt32;
 SendEvent(Srv+' received: '+IntToStr(Data));

 Data:= 9999;
 SendEvent(Srv+' Send: '+IntToStr(Data));
 AContext.Connection.Socket.Write(Data);

 AContext.Connection.Disconnect;
 SendEvent(Srv+' stopped.');
end;

end.
雷米·勒博

是的,从另一个线程中的同一连接读取时,在一个线程中发送连接是安全的。套接字具有用于入站和出站数据的独立内部缓冲区。

只要确保您不尝试在不同步访问连接的情况下尝试同时从两个线程发送或从两个线程读取数据即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Send a message in indy TCP

来自分类Dev

在indy TCP中发送消息

来自分类Dev

Delphi / Indy多线程服务器

来自分类Dev

结合indy和ics之间的编码

来自分类Dev

Indy SNMP陷阱有版本选项吗?

来自分类Dev

使用共享内存在两个进程之间传递套接字描述符

来自分类Dev

使用共享内存在两个进程之间传递套接字描述符

来自分类Dev

Indy可以从内存中加载SSL证书吗?

来自分类Dev

可以在Android Codetyphon上使用PL_indy吗?

来自分类Dev

是否可以在两个线程之间共享相同的消息队列?

来自分类Dev

在两个线程之间共享时间变量

来自分类Dev

如何在两个线程之间共享数据

来自分类Dev

Delphi 7 Indy 9多线程HTTP服务器

来自分类Dev

无法连接到Indy SSL TCP服务器

来自分类Dev

Indy TCP服务器中的用户身份验证

来自分类Dev

未收到Indy TCP客户端数据

来自分类Dev

使用tcp indy10进行实时音频流

来自分类Dev

带Indy 10的Delphi-TCP通讯的最佳方法

来自分类Dev

Indy TCP服务器中的用户身份验证

来自分类Dev

Hyperledger Aries和Hyperledger Indy之间的主要区别?

来自分类Dev

在Indy 10中是否可以使用IMAP GetLineResponse?

来自分类Dev

在Indy 10中是否可以使用IMAP GetLineResponse?

来自分类Dev

带有Indy套接字的UDP广播:如何选择正确的接口?

来自分类Dev

如何使用 Indy 组件从具有多重绑定的 IDTCPServer 套接字发送

来自分类Dev

服务器可以在c中打开两个TCP套接字吗?

来自分类Dev

两个线程可以同时与同一端口上的两个不同的套接字交互吗?

来自分类Dev

如何在两个线程之间共享或避免共享Websocket资源?

来自分类Dev

如何在两个线程之间实时更新共享的布尔变量?

来自分类Dev

在更新时立即反映对两个线程之间的共享变量所做的更改

Related 相关文章

  1. 1

    Send a message in indy TCP

  2. 2

    在indy TCP中发送消息

  3. 3

    Delphi / Indy多线程服务器

  4. 4

    结合indy和ics之间的编码

  5. 5

    Indy SNMP陷阱有版本选项吗?

  6. 6

    使用共享内存在两个进程之间传递套接字描述符

  7. 7

    使用共享内存在两个进程之间传递套接字描述符

  8. 8

    Indy可以从内存中加载SSL证书吗?

  9. 9

    可以在Android Codetyphon上使用PL_indy吗?

  10. 10

    是否可以在两个线程之间共享相同的消息队列?

  11. 11

    在两个线程之间共享时间变量

  12. 12

    如何在两个线程之间共享数据

  13. 13

    Delphi 7 Indy 9多线程HTTP服务器

  14. 14

    无法连接到Indy SSL TCP服务器

  15. 15

    Indy TCP服务器中的用户身份验证

  16. 16

    未收到Indy TCP客户端数据

  17. 17

    使用tcp indy10进行实时音频流

  18. 18

    带Indy 10的Delphi-TCP通讯的最佳方法

  19. 19

    Indy TCP服务器中的用户身份验证

  20. 20

    Hyperledger Aries和Hyperledger Indy之间的主要区别?

  21. 21

    在Indy 10中是否可以使用IMAP GetLineResponse?

  22. 22

    在Indy 10中是否可以使用IMAP GetLineResponse?

  23. 23

    带有Indy套接字的UDP广播:如何选择正确的接口?

  24. 24

    如何使用 Indy 组件从具有多重绑定的 IDTCPServer 套接字发送

  25. 25

    服务器可以在c中打开两个TCP套接字吗?

  26. 26

    两个线程可以同时与同一端口上的两个不同的套接字交互吗?

  27. 27

    如何在两个线程之间共享或避免共享Websocket资源?

  28. 28

    如何在两个线程之间实时更新共享的布尔变量?

  29. 29

    在更新时立即反映对两个线程之间的共享变量所做的更改

热门标签

归档