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.
Bookmarks