0

私はチャットプログラムの作成に取り組んでいます。しかし、何らかの理由で私のストリームが通過しません。誰かが私のコードをチェックして、私が間違っていることを教えてもらえますか?

クライアント側:

procedure TForm1.Button1Click(Sender: TObject);
var
  myStream : TMemoryStream;
  chat : String;
begin
  //Creating a stream
  chat := 'bladibla';
  myStream := TMemoryStream.Create();
  myStream.Size := Length(Chat);
  myStream.WriteBuffer(Pointer(Chat)^, Length(Chat));

  //Resetting the stream position
  myStream.Position := 0;

  //Sending the stream
  TcpClient1.Active := true;
  TcpClient1.SendStream(myStream);
  TcpClient1.Active := false;

  //Free the stream
  myStream.Free;
end;

サーバ側:

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  chat : string;
begin
//Receives the message from the client
  ClientSocket.ReceiveBuf(Pointer(Chat)^,Length(Chat),0);

  memo1.Lines.Add(chat);
  memo1.Lines.Add('------');
end;
4

1 に答える 1

1

D2009 以降を使用している場合は、送信時にデータが半分になります。また、最終的に を使用してデータを読み取ることになるReceiveBufため、長さマーカーを先頭に追加することはおそらく賢明でしょう。実質的ではありませんが、メモリ ストリームを事前に設定する必要はなくSize、ストリームの使用を try/finally ブロックでラップする必要があります。

procedure TForm1.Button1Click(Sender: TObject);
var
  myStream : TMemoryStream;
  chat : String;
  Len: Int32;
begin
  //Creating a stream
  chat := 'bladibla';
  myStream := TMemoryStream.Create();
  try
    Len := Length(Chat);
    myStream.WriteBuffer(Len, SizeOf(Len));
    myStream.WriteBuffer(Pointer(Chat)^, Len * SizeOf(Char));

    //Resetting the stream position
    myStream.Position := 0;

    //Sending the stream
    TcpClient1.Active := true;
    TcpClient1.SendStream(myStream);
    TcpClient1.Active := false;
  finally
    //Free the stream
    myStream.Free;
  end;
end;

受信コードの場合、Chatバッファを事前に割り当てていません。そのため、Length(Chat)0 になります。上記の提案されたコードを考えると、最初に長さマーカーを読み取ることができます。

procedure TForm1.TcpServer1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  chat : string;
  Len: Int32;
begin
  //Receives the message from the client
  ClientSocket.ReceiveBuf(Len, SizeOf(Len),0);
  SetLength(Chat, Len);
  ClientSocket.ReceiveBuf(Pointer(Chat)^,Len * SizeOf(Char),0);

  memo1.Lines.Add(chat);
  memo1.Lines.Add('------');
end;

最後に... このコードで使用されているコンポーネントは非推奨であるため、代わりに Indy を調査することをお勧めします。

于 2013-11-04T11:56:36.297 に答える