| Autor |
Beitrag |
Born-to-Frag
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 346
|
Verfasst: 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 
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: 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 
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: 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:
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$') |
Auszüge von OnRead vom Server:
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, 0, 17) = 'ready for screen?' then begin FileSize := StrToInt(Copy(RecievedText, 19, Pos('$END$', RecievedText) - 19)); ShowMessage(IntToStr(FileSize)); Mode := 2; RecievedSize := 0; Socket.SendText('send screen'); end else if Copy(RecievedText, 0, 10) = 'Screen end' then LoadJpegStream(MS) else ... until Pos('$END$', RecievedText) = 0 else begin 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); 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 
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: Sa 25.02.06 11:49
Habs jetzt geschafft! Werde die Lösung posten wenn ich fertig bin..
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.
|
|
ex4ct
      
Beiträge: 67
Delphi 7
|
Verfasst: Fr 21.07.06 13:21
und? .. nach 5 Monaten immernoch nicht fertig ? 
|
|
Born-to-Frag 
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: Fr 21.07.06 13:45
richtig, es hat nie richtig funktioniert und ich habs doch mit ner boolean variable gemacht
Also warte ich gespannt auf Narses' Binätprorokoll
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:
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 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); end else if MyStream.Position < ReceiveSize then Socket.ReceiveBuf(Pointer(Int64(MyStream.Memory) + MyStream.Position)^, rL) else begin MyStream.Clear; ReceiveSize := 0; Recording := False; Exit; end; if MyStream.Position + rL > ReceiveSize then MyStream.Position := ReceiveSize else MyStream.Position := MyStream.Position + rL; if MyStream.Position = ReceiveSize then begin 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 ;-)
|
Verfasst: 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 
      
Beiträge: 1094
Win XP SP2, Win 2000 SP4
Delphi 7, 2k5
|
Verfasst: Mi 26.07.06 01:27
Und bringen tut das genauso wenig...
greetz
EDIT:  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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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").
Viel Erfolg damit.  Danke an alle, die dabei mitgeholfen haben.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|