Synapse: Não é possível receber dados de soquete
Pergunta
Eu estou usando Synapse com bloqueio de soquetes e tente enviar simplesmente texto para o cliente conectado. Aí vem o código:
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;
Primeiro, clique no Botão 3, então eu clique Button2. Ao fazê-lo, não há nada sendo escrito dentro do campo memo1.
não deve este trabalho?
#
**** EDIT: ****
#
De acordo com skramads comentário, eu já dividi-la em 2 programas. Aqui vamos nós:
Cliente:
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;
Servidor:
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;
Ainda assim, isso não funciona como pretendido. Eu só não obter dados ali.
Alguma idéia?
Solução
Você deve ler como comunicações do soquete trabalhar, por exemplo aqui (Inglês) ou aqui (alemão). Em suma: o soquete que você listen()
em no lado do servidor não é usado para a comunicação em si, você tem que chamar accept()
para abrir outra tomada como o parceiro para o cliente, e o uso que um para enviar e receber dados. O soquete de escuta é utilizado unicamente para aceitar outras conexões de outros clientes, que você pode usar para a comunicação entre um servidor e vários clientes em paralelo.
Talvez você deve primeiro examinar uma aplicação simples demonstração de cliente / servidor. Os princípios são os mesmos, se você usar Synapse, Indy ou programação API de baixo nível.
Outras dicas
Se você quebrar este em dois programas distintos, em seguida, ele vai trabalhar melhor. chamadas de bloqueio fazer exatamente isso ... eles bloquear até que eles completem.