我正在使用带有阻塞套接字的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;
首先,我单击按钮3,然后单击Button2。这样做,memo1字段中没有任何内容。
不应该这样吗?
****编辑:****
根据skramads评论,我现在将其分为2个程序。我们走了:
客户端:
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;
但是,这并不像预期的那样有效。我在那里没有数据。
有什么想法吗?
答案 0 :(得分:3)
您应该阅读套接字通信的工作原理,例如here(英文)或here(德文)。简而言之:服务器端listen()
打开的套接字不用于通信本身,您必须调用accept()
打开另一个套接字作为客户端的合作伙伴,并使用该套接字发送并接收数据。侦听套接字仅用于接受来自其他客户端的其他连接,然后您可以使用这些连接在一台服务器和多个客户端之间进行并行通信。
也许您应该首先检查一个简单的客户端/服务器演示应用程序。无论您使用Synapse,Indy还是低级API编程,原理都是相同的。
答案 1 :(得分:1)
如果你把它分成两个独立的程序,那么它会更好。阻止调用就是这样......它们会阻塞直到它们完成。