Results 1 to 4 of 4

Thread: Stream versturen met ICS

  1. #1

    Stream versturen met ICS

    Hallo,

    Ik heb een TWSocket en een TWSocketServer op een TForm. De client maakt verbinding met de server en ik kan data oversturen. Nu wil ik een Stream versturen. Aangezien het niet wilde lukken heb ik er wat omheen geprogrammeerd zodat het technisch wel werkt. Ik ben er alleen niet zo tevreden over.

    De stream wordt byte voor byte uitgelezen.
    Iedere byte wordt naar een string geconverteerd.
    Iedere string wordt verzonden via het socket.
    De string wordt ontvangen.
    Als de CR-LF voorbij komt wordt de buffer geconverteerd naar een byte.
    De byte wordt weer in een TMemoryStream geplaatst.

    Ik had elders op internet de volgende voorbeeldcode gevonden:
    Code:
    procedure TForm3.Button1Click(Sender: TObject); var
        Buf1 : array [0..1023] of char;
        Buf2 : Integer;
        Buf3 : PChar;
    begin
        WSocket1.Send(@Buf1, SizeOf(Buf1));  // Send 1024 bytes
        WSocket1.Send(@Buf2, SizeOf(Buf2));  // send the 4 bytes of the integer
        WSocket1.Send(Buf3, 123);            // Send 123 chars pointed by Buf3
    end;
    Is dit ook mogelijk met een Stream, en zo ja hoe moet je deze dan ontvangen?

    De code die ik op dit moment heb ziet er als volgt uit:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, OverbyteIcsMultiProgressBar, OverbyteIcsEmulVT,
      OverbyteIcsPop3Prot, OverbyteIcsWSocketS, OverbyteIcsWndControl,
      OverbyteIcsWSocket, StdCtrls;
    
    type
      TForm1 = class(TForm)
        WSocket1: TWSocket;
        Memo1: TMemo;
        Memo2: TMemo;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        WSocketServer1: TWSocketServer;
        Button4: TButton;
        procedure WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure WSocketServer1ClientConnect(Sender: TObject;
          Client: TWSocketClient; Error: Word);
        procedure Button4Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure DataAvailable(Sender: TObject; ErrCode: Word);
      end;
    
    var
      Form1: TForm1;
      SockClient: TWSocketClient;
    
    implementation
    
    {$R *.dfm}
    
    procedure SendStream(const stream: TStream; Socket: TWSocket);
      procedure SendByte(const data: Byte; Socket: TWSocket);
      begin
        Socket.SendLine(inttostr(data));
      end;
    var
      B: Byte;
    begin
      while stream.position < stream.Size do
      begin
        stream.Read(B, SizeOf(B));
        SendByte(B, Socket);
      end;
    end;
    
    function ReadString(Stream: TStream): String;
    var
      B: Byte;
      Size: Integer;
      I: Integer;
    begin
      stream.Read(Size, SizeOf(Size));
      setlength(result, Size);
      for I := 1 to Size do
      begin
        stream.Read(B, SizeOf(B));
        result[I] := Chr(B);
      end;
    end;
    
    procedure WriteString(Value:String; Stream: TStream);
    var
      B: Byte;
      Size: Integer;
      I: Integer;
    begin
      Size := length(Value);
      stream.Write(Size, sizeOf(Size));
      for I := 1 to Size do
      begin
        B := Ord(Value[I]);
        stream.Write(B, sizeOf(B));
      end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      WSocket1.Connect;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      WSocketServer1.Listen;
    end;
    
    procedure TForm1.Button3Click(Sender: TObject);
    var
      Stream: TMemoryStream;
    begin
      Stream := TMemoryStream.Create;
      WriteString('test', Stream);
      Stream.Position := 0;
      SendStream(Stream, WSocket1);
      Stream.Destroy;
    end;
    
    procedure TForm1.Button4Click(Sender: TObject);
    var
      Stream: TMemoryStream;
    begin
      Stream := TMemoryStream.Create;
      WriteString('test', Stream);
      Stream.Position := 0;
      SendStream(Stream, SockClient);
      Stream.Destroy;
    end;
    
    procedure TForm1.DataAvailable(Sender: TObject; ErrCode: Word);
    var
      Stream: TMemoryStream;
      Data: String;
      B: Byte;
      Size: Integer;
      I: Integer;
      Buffer: String;
    begin
      Stream := TMemoryStream.Create;
      Data := SockClient.ReceiveStr;
      Size := length(Data);
      Buffer := '';
      for I := 1 to Size - 1 do
      begin
        if (Data[I] = #$D) then
        begin
          B := strtoint(Buffer);
          Stream.Write(B, SizeOf(B));
          Buffer := '';
        end else if (Data[I] <> #$A) then
        begin
          Buffer := Buffer + Data[I];
        end;
      end;
      Stream.Position := 0;
      memo2.Lines.Add(ReadString(Stream));
      Stream.Destroy;
    end;
    
    procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
    var
      Stream: TMemoryStream;
      Data: String;
      B: Byte;
      Size: Integer;
      I: Integer;
      Buffer: String;
    begin
      Stream := TMemoryStream.Create;
      Data := WSocket1.ReceiveStr;
      Size := length(Data);
      Buffer := '';
      for I := 1 to Size - 1 do
      begin
        if (Data[I] = #$D) then
        begin
          B := strtoint(Buffer);
          Stream.Write(B, SizeOf(B));
          Buffer := '';
        end else if (Data[I] <> #$A) then
        begin
          Buffer := Buffer + Data[I];
        end;
      end;
      Stream.Position := 0;
      memo1.Lines.Add(ReadString(Stream));
      Stream.Destroy;
    end;
    
    procedure TForm1.WSocketServer1ClientConnect(Sender: TObject;
      Client: TWSocketClient; Error: Word);
    begin
      SockClient := Client;
      SockClient.OnDataAvailable := DataAvailable;
    end;
    
    end.

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Code:
    sock.send(destream.memory,destream.capacity)
    of zo?

  3. #3
    Quote Originally Posted by marcov View Post
    Code:
    sock.send(destream.memory,destream.capacity)
    of zo?
    Ok, het verzenden werkt. Capacity is overigens protected, maar Size doet het goed. Kan ik de data ook direct in een Stream ontvangen?

    op dit moment Begint de onDataAvailable met
    Code:
      Stream := TMemoryStream.Create;
      Data := WSocket1.ReceiveStr;
    Moet dat zoiets zijn als:
    Code:
      WSocket1.Receive(Stream,WSocket1.BufSize);

  4. #4
    Op dit moment heb ik zoiets:
    Code:
    var
      B: Byte;
      I: Integer;
      Data: String;
    begin
      Stream := TMemoryStream.Create;
      Data := WSocket1.ReceiveStr;
      for I := 1 to length(Data) do
      begin
        B := ord(Data[I]);
        Stream.Write(B, SizeOf(B));
      end;
      Stream.Position := 0;

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •