1

ソケットをブロックする 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 フィールド内には何も書き込まれません。

これはうまくいかないのですか?

#

****編集:****

#

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;

それでも、これは意図したとおりには機能しません。そこにはデータがありません。

何か案は?

4

2 に答える 2

3

ここ(英語) またはここ(ドイツ語)など、ソケット通信がどのように機能するかを読む必要があります。つまりlisten()、サーバー側のソケットは通信自体には使用されませんaccept()。クライアントのパートナーとして別のソケットを開くために呼び出し、そのソケットを使用してデータを送受信する必要があります。リスニング ソケットは、他のクライアントからの他の接続を受け入れるためだけに使用されます。これを使用して、1 つのサーバーと複数のクライアントの間で並行して通信できます。

最初に、単純なクライアント/サーバー デモ アプリケーションを調べる必要があるかもしれません。Synapse、Indy、または低レベルの API プログラミングを使用する場合でも、原則は同じです。

于 2009-08-10T22:48:49.393 に答える
1

これを2つの別々のプログラムに分割すると、うまく機能します。通話をブロックすると、まさにそれが実行されます...通話が完了するまでブロックされます。

于 2009-08-10T18:12:56.987 に答える