Autor Beitrag
Born-to-Frag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Fr 17.02.06 20:54 
Hallo!

Ich habe ein Problem:

Wie kann ich wenn ich von meinem Client zum Server ein Stream schicke, beim Server unterscheiden ob es ein String oder ein Stream ist (Ich mach das doch richtig bei OnClientRead, oder?) ? Irgendwie muss ich das ja verarbeiten und da ich auch SendText benutze kann ich das nicht so richtig :???:

Währe sehr dankbar für eine Antwort :)


greetz

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
Mr.Frisch
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 18.02.06 01:23 
Hi Born-to-Frag,

du könntest bevor du einen Text und Stream sendest erst einmal eine Nachricht schicken, dass jetzt etwas kommt und was es ist. Im Ereignis OnClientRead(Ja ist richtig) vom ServerSocket wertest du die erste Nachricht aus und weist dann ob gleich ein Text oder Stream gesendet wird.

Gruß Mr.Frisch
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Sa 18.02.06 01:42 
Kurzum: ein Protokoll definieren und entsprechend umsetzen. Auch ist die Länge des Streams wichtig um zu wissen wann wieder SendText() Daten kommen könnten. Dies muss natürlich vor dem Stream übermittelt werden, da eine Festlegung von bestimmten Zeichenfolgen Blödsinn ist - können ja selber im Stream vorkommen.

In Bezug auf ein Protokoll und den o.g. Komponenten gibt es genug Beiträge hier im Forum, einfach mal suchen.

_________________
49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
Born-to-Frag Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Sa 18.02.06 12:12 
Das mit dem Protokoll is klar da weiß ich schon wie ich das mache..

Ich werd das juetz mal umsetzen und micih noch mal melrden falls was nicht geht..


greetz

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
Born-to-Frag Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Do 23.02.06 20:23 
So.. jetzt hab ich das mal umgesetzt, bekomme es aber nicht hin :(

Zu meiner Funktion: Ich mache einen Screenshot vom Bildschirm und wandle ihn in ein Stream um. Soweit funktioniert es und das zurückwandeln funktioniert auch also liegt hier nicht der Fehler.

Nun will ich diesen Stream zum ServerSocket schicken. Ich poste hier mal die wichtigen Teile:

Hier schickt der Client das ein Screenshot kommen wird:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
    Str := TMemoryStream.Create;
    if Str <> nil then
    begin
      SaveScreen(Str);
      Str.Seek(0,soFromBeginning);
    end;
    Socket.SendText('ready for screen? ' + IntToStr(SizeOf(Str)) + '$END$'// $END$ ist Teil des Protokolls falls mal 2 Strings gleichzeitig ankommen sollten..


Auszüge von OnRead vom Server:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  RecievedText: String;
  Speicher: String;
  i: Integer;
  Txt: Textfile;
  Buf   : String;
  MsgLen, LenReceived : Integer;
begin
  i := M_Clients.Items.IndexOfObject(Socket);
  RecievedText := Socket.ReceiveText;

  if Mode = 1 then
  repeat
    if ...
    else if Copy(RecievedText, 017) = 'ready for screen?' then
    begin
      FileSize := StrToInt(Copy(RecievedText, 19, Pos('$END$', RecievedText) - 19));
      ShowMessage(IntToStr(FileSize));
      Mode := 2;  
      RecievedSize := 0;  // Globale Variable
      Socket.SendText('send screen');
    end
    else if Copy(RecievedText, 010) = 'Screen end' then
      LoadJpegStream(MS)
    else ...
  until Pos('$END$', RecievedText) = 0
  else
  begin
    //showmessage(inttostr(msglen));
    SetLength(Buf, MSgLen);
    LenReceived := Socket.ReceiveBuf(Buf[1],MsgLen);
    MS.Write(Buf[1],Length(Buf));
    Application.ProcessMessages;
    RecievedSize := RecievedSize + Socket.ReceiveLength;
    if RecievedSize >= FileSize then
    begin
      Mode := 1;
      FileSize := 0;
      RecievedSize := 0;
      LoadJpegStream(MS); // Steam in JPEG umwandeln.. funktioniert eigendlich, doch gibt er mir in diesem
                          // fall einen error, das liegt jedoch an den empfangenen daten da es sonst geht
    end;
  end;
end;


Ich glaube das waren die relevanten Teile..
Was mache ich falsch ?
Danke für alle Antworten :)


greetz

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
Born-to-Frag Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Sa 25.02.06 11:49 
Habs jetzt geschafft! Werde die Lösung posten wenn ich fertig bin..


greetz :party:

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
ex4ct
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 67


Delphi 7
BeitragVerfasst: Fr 21.07.06 13:21 
und? .. nach 5 Monaten immernoch nicht fertig ? :)
Born-to-Frag Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Fr 21.07.06 13:45 
richtig, es hat nie richtig funktioniert und ich habs doch mit ner boolean variable gemacht :mrgreen:

Also warte ich gespannt auf Narses' Binätprorokoll :D

EDIT: Oh, war Müll was ich geschrieben hab.. ich dachte das wäre ein anderes Topic in dem ich die Daten in Hex umwandle.. also die Lösung war simpel: Ich habe eine Boolean-Variable benutzt (z.B. "Recording") und wenn diese auf True steht, speichere ich eben in den Stream, und sobald dieser die Größe erreicht hat die mir der Client vorher mitgeteilt hat, wird der Stream abgespeichert bzw wird der Screenshot geladen ;)

Nach dem Source muss ich mal suchen..

EDIT2: Hier mal ein Soruce den ich kurz zusammengebastelt hab:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
var
  rL: Integer;
begin  
  if not Recording then //Normalen Text auswerten
  else 
  begin
    rL := Socket.ReceiveLength;
  
    if rL = 0 then Exit;
  
    if Stream.Position + rL > Options.ReceiveSize then
    begin
      Socket.ReceiveBuf(Pointer(Int64(MyStream.Memory) +
        MyStream.Position)^,
        ReceiveSize - MyStream.Position);//ReceiveSize Globale Vaialbe.. hier hat der client die Dateigröße mitgeteilt
    end
    else if MyStream.Position < ReceiveSize then
      Socket.ReceiveBuf(Pointer(Int64(MyStream.Memory) +
        MyStream.Position)^, rL)
    else  //übertragungsfehler
    begin
      MyStream.Clear;
      ReceiveSize := 0;
      Recording := False; //wieder als text auswerten
  
      Exit;
    end;
  
    if MyStream.Position + rL > ReceiveSize then
      MyStream.Position := ReceiveSize
    else MyStream.Position := MyStream.Position + rL;
 
  
  if MyStream.Position = ReceiveSize then //Stream vollständig übertragen:
  begin
    //hier datei speichern oder so...
    Recording := False;
  end;
end;

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
Trilithium
Hält's aus hier
Beiträge: 3

WinXP Pro ]=[ Ubuntu
B0rlanDelphi 7 PE + persl. Erweiterungen ;-)
BeitragVerfasst: Mi 26.07.06 01:21 
Lösung 2 : du verwendest nur streams und schriebst deinen Command-String in den Stream (Stream.Write(string,sizeof(string)); )
Born-to-Frag Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1094

Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
BeitragVerfasst: Mi 26.07.06 01:27 
Und bringen tut das genauso wenig... ;)


greetz

EDIT: :welcome: im Forum!

_________________
Theorie ist wenn man alles weiß, aber nichts funktioniert. Praxis ist wenn alles funktioniert, aber niemand weiß warum.
Microsoft vereint Theorie und Praxis: Nichts funktioniert und niemand weiß warum.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 17.11.06 00:05 
Moin!

Das Binär-Protokoll-Tutorial ist fertig. ;)

Als Beispielprogramm wird ein Chat entwickelt, der Dateiübertragung im Hintergrund ermöglicht und eine "Gemeinsam-Zeichnen"-Funktion hat ("Mal-Chat"). :D

Viel Erfolg damit. :zwinker: Danke an alle, die dabei mitgeholfen haben. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.