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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top