Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Synapse:无法从套接字接收数据_Delphi_Sockets_Synapse - Fatal编程技术网

Delphi Synapse:无法从套接字接收数据

Delphi Synapse:无法从套接字接收数据,delphi,sockets,synapse,Delphi,Sockets,Synapse,我正在使用带阻塞套接字的Synapse,并尝试将文本发送到连接的客户端。下面是代码: var SServer: TTCPBlockSocket; SClient: TTCPBlockSocket; implementation //Create and initialize the Sockets. procedure TForm1.FormCreate(Sender: TObject); begin SClient := TTCPBlockSocket.Create; SSe

我正在使用带阻塞套接字的Synapse,并尝试将文本发送到连接的客户端。下面是代码:

var
SServer: TTCPBlockSocket;
SClient: TTCPBlockSocket;

implementation
//Create and initialize the Sockets.
procedure TForm1.FormCreate(Sender: TObject);
begin
    SClient := TTCPBlockSocket.Create;
    SServer := TTCPBlockSocket.Create;
    SServer.Bind('127.0.0.1', '12345');
    SClient.Connect('127.0.0.1', '12345');
end;

//Wait for connections.
procedure TForm1.FormShow(Sender: TObject);
begin
    SServer.Accept;
    //SServer.Listen; <- Could also work here?
end;

//Send the string to the connected server.
procedure TForm1.Button3Click(Sender: TObject);
begin
    SClient.SendString('hi server');
end;

//Receive the string from the client with timeout 1000ms and write it into a memo
procedure TForm1.Button2Click(Sender: TObject);
var buf: string;
begin
    Memo1.Lines.Add(SServer.RecvString(1000));
end;
服务器:

var
  SClient: TTCPBlockSocket;

implementation

procedure TForm2.Button1Click(Sender: TObject);
begin
  SClient.SendString(Edit1.Text);
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  SClient := TTCPBlockSocket.Create;
end;

procedure TForm2.FormShow(Sender: TObject);
begin
  SClient.Connect('127.0.0.1','12345');
end;
var
  Form1: TForm1;
  SSocket: TTCPBlockSocket;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  SSocket.Bind('127.0.0.1','12345');
  SSocket.Listen;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo1.Lines.Add(SSocket.RecvString(1000));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SSocket := TTCPBlockSocket.Create;
end;
不过,这并没有达到预期效果。我只是没有数据


有什么想法吗?

如果你把它分成两个独立的程序,那么它会工作得更好。阻塞调用就是这样做的……它们阻塞直到完成

如果你把它分成两个独立的程序,那么它会工作得更好。阻塞调用就是这样做的……它们阻塞直到完成

您应该阅读套接字通信的工作原理,例如(英语)或(德语)。简而言之:服务器端的
listen()
套接字本身不用于通信,您必须调用
accept()
打开另一个套接字作为客户端的合作伙伴,并使用该套接字发送和接收数据。侦听套接字仅用于接受来自其他客户端的其他连接,然后您可以使用这些连接在一个服务器和多个客户端之间并行通信


也许您应该首先检查一个简单的客户机/服务器演示应用程序。无论您使用Synapse、Indy还是低级API编程,原理都是一样的。

您应该阅读socket通信的工作原理,例如(英语)或(德语)。简而言之:服务器端的
listen()
套接字本身不用于通信,您必须调用
accept()
打开另一个套接字作为客户端的合作伙伴,并使用该套接字发送和接收数据。侦听套接字仅用于接受来自其他客户端的其他连接,然后您可以使用这些连接在一个服务器和多个客户端之间并行通信


也许您应该首先检查一个简单的客户机/服务器演示应用程序。无论是使用Synapse、Indy还是低级API编程,原理都是一样的。

ok,现在开始工作。不过,loadfromstream不起作用。你的问题中没有提到loadfromstream是什么意思?请澄清。好的,现在开始工作了。不过,loadfromstream不起作用。你的问题中没有提到loadfromstream是什么意思?请澄清。