Entwickler-Ecke
Internet / Netzwerk - [TServerSocket] SendText und SendStream unterscheiden
Born-to-Frag - Fr 17.02.06 20:54
Titel: [TServerSocket] SendText und SendStream unterscheiden
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
Mr.Frisch - 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 - 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.
Born-to-Frag - 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
Born-to-Frag - 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:
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, 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
Born-to-Frag - Sa 25.02.06 11:49
Habs jetzt geschafft! Werde die Lösung posten wenn ich fertig bin..
greetz :party:
ex4ct - Fr 21.07.06 13:21
und? .. nach 5 Monaten immernoch nicht fertig ? :)
Born-to-Frag - 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:
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 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; |
Trilithium - 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 - Mi 26.07.06 01:27
Und bringen tut das genauso wenig... ;)
greetz
EDIT: :welcome: im Forum!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!