Nochmal Problem mit schicken einer Datei
Übersicht

![]() |
Jolinah |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Markus
Ja das stimmt, den Code hab ich gestern relativ schnell geschrieben, danke für den Hinweis ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielen Dank erstmal!!!
@ Markus Ahaa ich beginne zu verstehen ![]() ![]() @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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ändert leider nichts, es klappt immer noch nicht.
Und nochwas: wenn ich das Server Programm schließe kommt ne Meldung von Windows Vista: 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group