Nochmal Problem mit schicken einer Datei

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Jolinah

BeitragDi, Apr 15, 2008 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
@Markus
Ja das stimmt, den Code hab ich gestern relativ schnell geschrieben, danke für den Hinweis Wink Ein paar Sachen habe ich jetzt noch verbessert und oben reineditiert. Trotzdem kann man wahrscheinlich noch einiges besser machen...

@Mabox
Dass es etwas langsamer wird stimmt, in dem man die Buffergrösse variiert kann man das aber beeinflussen. Im editierten Code oben, habe ich jetzt mal 64kb statt 4kb genommen, das macht schon viel aus. Dateien die kleiner als 64kb sind, werden dann sowieso in einem Schleifendurchgang empfangen, nur die grösseren werden jeweils in 64kb Stücke pro Schleifendurchlauf aufgeteilt. Wie Markus schon sagte, werden aber die Daten von TCP sowieso in eigene Pakete aufgeteilt.

Ein Vorteil dieser Variante ist wie gesagt, dass immer nur Arbeitsspeicher mit der Grösse des Buffers verwendet wird. Und so können mehrere Clients "gleichzeitig" Dateien vom Server laden. Der Nachteil ist dann eben dass es etwas langsamer wird.

Edit:
Zitat:
Wenn du z.B. nur 100 Byte bekommst (z.B. als Rest) solltest du keine Anweisung geben 4096 Byte (als Puffer) auszulesen.


Die ReadBytes()-Methode liest ja nur was ankommt und füllt den Buffer soweit. Mit dem Rückgabewert kann man dann feststellen wie viele Bytes in den Buffer geschrieben wurden. Oder meinst du wegen dem Speicherverbrauch?

Edit2: Beim Senden kann man natürlich komplett alles in den Buffer schreiben, aber macht es Sinn die Datei vorher komplett in den Arbeitsspeicher zu laden?. Daher habe ich auch dort mit einem Buffer gearbeitet.
  • Zuletzt bearbeitet von Jolinah am Di, Apr 15, 2008 19:48, insgesamt 2-mal bearbeitet

mabox

BeitragDi, Apr 15, 2008 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank erstmal!!!

@ Markus
Ahaa ich beginne zu verstehen Idea ...hätte ich das früher gewusst Very Happy

@Jolinah
Hm jetzt beginne ich dochnochmal zu überlegen welche Methode ich nehme...

leider kann icsh grad nicht testen...
soll das dann so aussehen im Client? (nach der Methode von Markus)
Code: [AUSKLAPPEN]
While Not Eof(tcp)
   ankommende_bytes = ReadAvail(tcp)
   Byte=ReadBytes (Speicherfeld2, tcp, b, ankommende_bytes)
   gesp=WriteBytes (Speicherfeld2, Datei2, g, Byte)
   b = b + Byte
   g = g + gesp
Wend

Markus2

BeitragDo, Apr 17, 2008 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Du mußt noch bedenken das das Netzwerk langsam ist und du den Puffer
schneller auslesen kannst wie Pakete kommen .

Ich würde erstmal
if ankommende_bytes>0 then
und
debuglog "ankommende_bytes=" + ankommende_bytes
...
einbauen .

mabox

BeitragSo, Mai 18, 2008 21:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Leider kann ich mich erst jetzt wieder melden zu diesem Thema, ich hatte lange nur einen Rechner und konnte das Programm deshalb nicht testen.

Also ich hab mir das jetzt mal alles was ausgelesen, gesendet und gespeichert wird im Debugfenster ausgeben lassen.
Wenn ich kleine Dateien (unter 1 MB) verschicke funktionierts Very Happy , aber wenn ich irgendwas größeres verschicke steht im Debugfenster vom Server, dass die Bytes aus der Datei ausgelesen wurden, aber nicht verschickt wurden. Im Debugfenster vom Client steht dann natürlich das nix angekommen ist (also 0 Byte), aber im Programmfenster steht das die Datei erfolgreich angekommen ist.
Ich versteh das ganze nicht mehr...
kann mir noch jemand helfen?

mein aktueller Server Code: [AUSKLAPPEN]
;Server
Graphics 640,480,16,2
AppTitle "Server"

.datei_laden

;das hier ist unwichtig (da ist der Fehler ganz sicher nicht)
;=========================================================================
ClsColor 204,204,204
Cls
Color 0,0,0
Text 10,90, "zieh eine Datei hier rein..."
WindowAcceptFiles( SystemProperty( "AppHWND" ), True )

Local datei_zum_senden$
Local result$
While datei_zum_senden$ = ""
   result = ReturnAcceptedFiles( )
   If( results <> datei_zum_senden$ And result <> "" )
      datei_zum_senden$ = result
   EndIf
   Delay 10
Wend
WindowAcceptFiles( SystemProperty( "AppHWND" ), False )
;=========================================================================

Repeat
   zaehlen = zaehlen+1
   DateiName$ = Right$(datei_zum_senden$,zaehlen)
Until Left (DateiName$, 1) = "\"

DateiName$=Mid(DateiName$, 2)
Datei1=OpenFile(datei_zum_senden$)
If Datei1 = 0 Then Goto datei_laden
Dateigroesse1=FileSize(datei_zum_senden$)
Cls
Text 10,90, "Pfad: " + datei_zum_senden$

;=========================================================================
;CHECKEN WI GROß DIE DATEI IST
;If Dateigroesse1 < 1048576 Then
;   teilung = 1024
;   q$ = " KB"
;ElseIf Dateigroesse1 < 1073741823
;   teilung = 1048576
;   q$ = " MB"
;Else
;   teilung =  1073741824
;   q$ = " GB"
;EndIf
;=========================================================================


Text 10,105, "Dateigröße: "+DateiName$+" "+Dateigroesse1
Speicherfeld1 = CreateBank(Dateigroesse1)

server=CreateTCPServer(21)

While Not fertig <> 0
   senden=AcceptTCPStream(server)
   If senden Then
      ankommend$ = ReadString(senden)
      Text 10,120,ankommend$
      WriteString(senden, DateiName$)
      WriteInt senden, Dateigroesse1
      Byte=ReadBytes (Speicherfeld1, Datei1, 0, Dateigroesse1)
      gespeichert=WriteBytes (Speicherfeld1, senden, 0, Dateigroesse1)
      fertig = 1
   EndIf
Wend

DebugLog "gelesene Bytes: " + Byte
DebugLog "gesendete Bytes: " + gespeichert
CloseTCPServer server
CloseFile Datei1
Text 10,150, "Datei erfolgreich gesendet"   
WaitKey()


und der Client Code: [AUSKLAPPEN]
;Client
Graphics 640,480,16,2
AppTitle "Client"

.start
ClsColor 204,204,204
Cls
Color 0,0,0
Locate 10,200
ip$ = Input ("IP eingeben: ")
Cls
tcp = OpenTCPStream(ip$, 21)

If tcp<>0 Then
   Text 10,90, "Verbindung erfolgreich hergestellt."
Else
   Text 10,90, "Verbindung konnte nicht hergestellt werden."
   Text 10,105, "drück eine Taste um es erneut zu versuchen."
   WaitKey()
   Goto start
   End
End If
WriteString tcp,"Client hat sich eingeklinkt..."

Datei_zum_bekommen$=ReadString(tcp)
Dateigroesse2=ReadInt(tcp)
Datei2=WriteFile(Datei_zum_bekommen$)
Speicherfeld2 = CreateBank(Dateigroesse2)

Text 10,105, Datei_zum_bekommen$+" runterladen von "+ip$
Text 10,120, "Größe: " + Dateigroesse2+ " Bytes"

While Not Eof(tcp)
   ankommende_bytes = ReadAvail(tcp)
   If ankommende_bytes>0 Then   
      DebugLog "ankommende_bytes=" + ankommende_bytes
      Byte=ReadBytes (Speicherfeld2, tcp, b, ankommende_bytes)
      gesp=WriteBytes (Speicherfeld2, Datei2, g, Byte)
      b = b + Byte
      g = g + gesp
   EndIf
Wend

DebugLog "gelesene Bytes: " + Byte
DebugLog "gesendete Bytes: " + gesp
DebugLog "g: " + b
DebugLog "b: " + g
Text 10,150, "Datei angekommen"
CloseTCPStream tcp
CloseFile Datei2
WaitKey()
End
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Markus2

BeitragSo, Mai 18, 2008 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Fände ich beim Client besser

Statt
Byte=ReadBytes (Speicherfeld2, tcp, b, ankommende_bytes)
gesp=WriteBytes (Speicherfeld2, Datei2, g, Byte)

Sowas
Bytes=ReadBytes (Speicherfeld2, tcp, 0, ankommende_bytes)
gesp=WriteBytes (Speicherfeld2, Datei2,0, ankommende_bytes)

mabox

BeitragMo, Mai 19, 2008 7:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ändert leider nichts, es klappt immer noch nicht.

Und nochwas: wenn ich das Server Programm schließe kommt ne Meldung von Windows Vista:
user posted image
weis jemand woran das liegt?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group