AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi ClientSocket steam verschicken mit vorherigen Zeichen

ClientSocket steam verschicken mit vorherigen Zeichen

Ein Thema von gandime · begonnen am 26. Jan 2008 · letzter Beitrag vom 27. Jan 2008
Antwort Antwort
Seite 2 von 2     12
gandime
(Gast)

n/a Beiträge
 
#11

Re: ClientSocket steam verschicken mit vorherigen Zeichen

  Alt 26. Jan 2008, 20:12
nein guck doch mal die Antwort von Muetze1 an steht wieder eine Möglichkeit drinne!
also du brauchst ein Zeichen oder eine Zeichenfolge die dir sagt: fertig hatte da mal was schönes gecodet:
Delphi-Quellcode:
procedure TForm1.ss_serverClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s_receve,s_temp:string;
  b_da:boolean;
  I,i_sockethander: Integer;
begin
  i_sockethander:=socket.SocketHandle;
  for I := 0 to lv_bots.Items.Count - 1 do
  begin
    if (lv_bots.Items.Item[i].SubItems.Strings[8]=inttostr(i_sockethander)) then
    begin
      s_receve:=lv_bots.Items.Item[i].SubItems.Strings[9];
    end;
  end;
  s_receve:=s_receve+Socket.ReceiveText;
  repeat
  begin
    b_da:=false;
    s_temp:='';
    for I := 0 to length(s_receve) -1 do
    begin
      if (s_receve[i]='|') then
      begin
        b_da:=true;
      end;
    end;
    if (b_da=true) then
    begin
      s_temp := copy(s_receve, 1, pos('|', s_receve) - 1);
      s_receve := copy(s_receve, pos('|', s_receve) + 1, length(s_receve));
      for I := 0 to lv_bots.Items.Count - 1 do
      begin
        if (lv_bots.Items.Item[i].SubItems.Strings[8]=inttostr(i_sockethander)) then
        begin
          lv_bots.Items.Item[i].SubItems.Strings[9]:=s_receve;
        end;
      end;
      if (s_temp<>'') then
      begin
        handle(i_sockethander,s_temp);
      end;
    end;
  end;
  until (b_da=false);
end;
damit geht es theoretisch aber du brauchst halt egl zeichen die in einer Datei nicht vorkommen... was aber schwierig wird da ja jedes Zeichen vorkommen kann
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#12

Re: ClientSocket steam verschicken mit vorherigen Zeichen

  Alt 26. Jan 2008, 20:13
Zitat von d1ng0d0gt0r:
Genau aus dem Grund würde ich die Daten in so kleinen Schnippseln aus der Datei einlesen und versenden, das eben so etwas nicht passiert.
Hey, dann war mein Hinweis doch nicht umsonst. Aber genau diese Trennung gibt es nicht, es würde nicht eine Codezeile programmiert um diese Trennung zu übermitteln, weil dazu bräuchte es ein Protokoll und die Komponenten übermitteln aber nur Daten und haben kein Protokoll, weil sonst wären sie nur beschränkt nutzbar.

Somit: Du musst dir selber ein Protokoll ausdenken und entsprechend umsetzen. Wenn du weisst, dass der Anfang immer "File-xxxxx:" ist, dann kannst du im OnClientRead (wenn noch keine Datei empfangen wird), schauen ob im Buffer (Delphi-Referenz durchsuchenSocket.ReceiveLength()) diese Mindestlänge enthalten ist und wenn ja, dann nur diese Anzahl von Zeichen auslesen (im Beispiel hier also 11 Zeichen) und alle nachfolgenden Zeichen sind dann Dateiinhalt.

Das ist dann schon eine Art Protokoll.

/EDIT: roter Kasten???

/EDIT2: gandime: du weisst um direkte Vergleiche mit true bzw. false?
  Mit Zitat antworten Zitat
gandime
(Gast)

n/a Beiträge
 
#13

Re: ClientSocket steam verschicken mit vorherigen Zeichen

  Alt 27. Jan 2008, 13:51
Die Procedure von oben ist schon etwas älter und überholt hatte nich wieder rübergeguckt.
Hab mir jetzt mal eine andere überlegt und zwar werden als erste paar zeichen die Länge des Strings geschickt usw guckt selber
Delphi-Quellcode:
procedure TForm1.send(s_text:string);
var
  s_length:string;
  i_length:integer;
begin
  i_length:=length(s_text);
  if i_length<10 then
  begin
    s_length:='000'+inttostr(i_length);
  end
  else if i_length<100 then
  begin
    s_length:='00'+inttostr(i_length);
  end
  else if i_length<100 then
  begin
    s_length:='0'+inttostr(i_length);
  end
  else
  begin
    s_length:=inttostr(i_length);
  end;
  cs.Socket.SendText(s_length+s_text);
end;

procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s_receive,s_length,s_command:string;
  i_length:integer;
begin
  if length(s_buff)+socket.ReceiveLength>=4 then
  begin
    s_receive:=s_buff+socket.ReceiveText;
    s_length:=s_Receive;
    setlength(s_length,4);
    i_length:=strtoint(s_length);
    if length(s_receive)-4>=i_length then
    begin
      s_receive:=copy(s_receive,4+1,length(s_receive));
      s_command:=s_receive;
      setlength(s_command,i_length);
      s_buff:=copy(s_receive,i_length+1,length(s_receive));
      //und dann halt auswerten
    end
    else
    begin
      s_buff:=s_receive;
    end;
  end
  else
  begin
    s_buff:=s_buff+socket.ReceiveText;
  end;
end;
jetzt wollte ich fragen ob es zu Komplikationen kommen kann?
wenn z.B. der Server ein falschen Start String bekommt wie finde ich dann den nächsten anfang?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz