Synapse: не удается получить данные из сокета - PullRequest
1 голос
/ 10 августа 2009

Я использую 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, а затем нажимаю кнопку 2. При этом в поле memo1 ничего не пишется.

Разве это не должно работать?

#

**** EDIT: ****

#

Согласно комментарию скрамадса, я теперь разделил его на 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;

Тем не менее, это не работает, как задумано. Я просто не получаю данных там.

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 11 августа 2009

Вы должны прочитать, как работает сокетная связь, например здесь (английский) или здесь (немецкий). Вкратце: сокет, на котором вы listen() на стороне сервера, не используется для самой связи, вам нужно позвонить на accept(), чтобы открыть другой сокет в качестве партнера для клиента, и использовать его для отправки и получения данных. Прослушивающий сокет используется исключительно для приема других соединений от других клиентов, которые затем можно использовать для одновременной связи между одним сервером и несколькими клиентами.

Возможно, вам следует сначала изучить простое демонстрационное приложение клиент / сервер. Принципы одинаковы, используете ли вы Synapse, Indy или низкоуровневое программирование API.

1 голос
/ 10 августа 2009

если разбить это на две отдельные программы, то это будет работать лучше. Блокирующие вызовы делают именно это ... они блокируют, пока не завершат.

...