Entwickler-Ecke

Internet / Netzwerk - Mein HTTP-Server, mehrere Verbindungen


hui1991 - So 15.10.06 20:15
Titel: Mein HTTP-Server, mehrere Verbindungen
Hallo,
ich will ein HTTP-Server basteln, da mein Freund ein Programm braucht um Daten einfach zu teilen.
z. B. Screenshots von World of Warcraft ;)
Jetzt hat er das Problem, das er ein einfaches Programm braucht.
Ja dann hab ich mich heute mal hingesetzt, mir die TIdHTTPServer komponente angeschaut.
Ich hab mir als erstes das Senden ran gemacht, diese komischen Berechnungen sind berechnungen um bei schwacher verbindung weniger große Pakete zu senden und je besser die Verbindung desto größere Pakete werden gesendet. Die Variablen sind bei mir immer so komische, die eigentlich dazu nicht passen xD
Also hier mein senden code:

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:
47:
48:
49:
50:
51:
52:
53:
54:
procedure TFOrm1.send(AThread: TIdPeerThread);
var
  items,test: String;
  maybe,size,maul,multi: Integer;
  fs, fn: TFileStream;
  zeichen: char;
begin
  Memo1.Clear;
  connectedf:=True;
  sollichzaehln:=False;
  items:='';
  inc(Intzaehler);
  multi:=1;
  try
    AThread.Start;
    fs := tFilestream.create('test.zip', FMOpenRead);
    size:=fs.Size;
    AThread.COnnection.WriteLn('HTTP/1.1 200 OK');
    AThread.Connection.WriteLn('Server: hui1991s Fileserver');
    AThread.COnnection.WriteLn('Accept-Ranges: bytes');
    AThread.COnnection.WriteLn('Content-Length: '+inttostr(size));
    AThread.COnnection.WriteLn('Connection: close');
    AThread.COnnection.WriteLn('Content-Type: file/zip');
    AThread.COnnection.WriteLn('');
    sollichzaehln:=True;
    msekunden:=0;
    maul:=1;
    For maybe:=0 to size-1 do begin
      fs.read(zeichen,1);
      items:=items+zeichen;
      if length(items)>maul+1 then begin
          AThread.Connection.Write(items);
        items:='';
        multi:=((maul+1div (multi*3))+((1000 div (size div (maybe+1))+1));
        maul:=((maybe div 1000div ((msekunden div 1000)+1))*multi;
        if maul>0 then
          Memo1.Lines.Add(inttostr(maul));
     end;
    end;
    if length(items)>0 then begin
      AThread.Connection.Write(items);
      items:='';
      Label1.Caption:='100%..Fertig(Die Übertragung hat '+inttostr(msekunden div 1000)+' gedauert!|'+inttostr(((size * 8 div 1024)+1div ((msekunden div 1000)+1)+20)+'KBit/s)';
    end;
    sollichzaehln:=False;
  except
    Label1.Caption:='Error!';
    fs.free;
    open:=false;
  end;
  fs.free;
  AThread.Stop;
  open:=false;
end;


Aufrufen tuhe ich es ganz einfach mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.IdHTTPServer1Connect(AThread: TIdPeerThread);
begin
  if not open then begin
    open:=True;
    send(AThread);
  end;
end;


Jetzt sind die Probleme die gemeinsam eine Kette bilden.
Wenn FlashGot eine Zweite verbindung aufbauen will macht es ein Error, dies verhinderte ich mit der variable open.
Dann wenn der Client die Verbindung abbricht, dann kommt bei mir ein Error.
Warscheinlich will er auf was Schreiben das es nicht gibt, ich aber net weis wie ich es beheben soll.
Dieses problem mit mehrverbindungen tritt wieder ein. Wenn ein Download bei mir stattfindet, dann kann ein zweiter CLient nicht drauf zugreifen, da der Server nicht antwortet. Könnt ihr mir bei diesem Problem helfen?
Wäre euch dankbar, denn ich finde keine Vorlagen. Ich hab einfach blind probiert.

MfG
hui1991


Grendel - Mo 16.10.06 11:39
Titel: Re: Mein HTTP-Server, mehrere Verbindungen
user profile iconhui1991 hat folgendes geschrieben:
Wenn ein Download bei mir stattfindet, dann kann ein zweiter CLient nicht drauf zugreifen, da der Server nicht antwortet.

Da du das "Send()" im Hauptthread aufrufst blockiert dieser für diese Zeit natürlich weitere Verbindungen. Starte im "IdHTTPServer1Connect" einfach einen neuen Thread und handle den Send()-Vorgang in diesem ab.

Bis neulich ...


hui1991 - Mo 16.10.06 21:18

Danke für die Antwort,

aber ich weis leider nicht wie ich es anstellen soll.
Mit dem Netzwerk arbeite ich ja net so. ICh weis net wie ich einen neuen Thread erstellen soll.
Würde mich über einen kleinen Beispielcode freuen. Denn in der Delphi-Hilfe steht nix davon drin.

MfG
hui1991