B
brekki
Hallo zusammen,
ich habe ein kleines Problem mit der Übertragung von Dateien via TCP/IP. Ich mir die angehängte Datei aus einem Post (http://www.tutorials.de/forum/net-a...ne-datei-zu-einem-programm-2.html#post1092721) als Vorlage genommen und wollte dann entsprechend weiter gehen und es mit dem umgekehrten Weg versuchen.
Also nicht: Client bietet Server Datei an und Server sagt "ja, die nehme ich" und der Upload wird freigegeben
Sondern: Client fordert Datei bei Server an, Server sagt "Passt scho" und der Download beginnt.
Mit dem Download an sich habe ich keine Probleme, nur der Beendigung des Stream. Da bleibt mit das Programm immer hängen. Habe jetzt zu lange auf den Quellcode geschaut und kann ihn nicht mehr fehlerneutral betrachten, eine neutrale Fehlerhilfe wäre mir sehr willkommen.
Hier ist der Code des Servers zum Senden der Datei (der Code läuft ohne Probleme durch, also das versenden der Datei wird einwandfrei beendet und er meldet mir auch nacher "successfully send"):
private void sendFile(NetworkStream stream, string filename)
{
FileStream fstream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
long s_length = fstream.Length;
long s_read = 0;
// Übertragen der Dateigröße zur Verarbeitung auf Client
//send(stream, "LENGTH " + s_length);
using (BinaryReader reader = new BinaryReader(fstream))
{
while (s_length > s_read)
{
byte[] buffer = new byte[1024];
int read = reader.Read(buffer, 0, 1024);
s_read += read;
sendBuffer(stream, buffer, read);
//int pc = (int)((((double)s_read) / ((double)s_length)) * 100);
//if (pc % 5 == 0)
// Percentage = pc;
}
}
stream.Flush();
Console.WriteLine(DateTime.Now.ToLocalTime()
+ " '{0}' successfully send..", filename);
}
Hier der Code des Clients (Dateiübertragung einwandfrei, lässt sich auch öffnen - ich hatte eine Accessdatei zum testen übertragen) aber der stream wird nicht beendet):
public void LoadFile(string path, string file)
{
TcpClient client = new TcpClient();
client.Connect(m_server, m_port);
NetworkStream stream = client.GetStream();
sendMsg(stream, "GET " + file);
string msg = readMsg(stream);
string accept_msg = "OK " + file;
System.Diagnostics.Debug.WriteLine(string.Format("Ready '{0}' - Receiving '{1}'",
msg, accept_msg));
// Annahme der Dateigröße zur Verarbeitung für z. B. ProgressBar
//string length = readMsg(stream);
//long s_length = Convert.ToInt64(length.Substring(7, length.Length - 7));
//long s_read = 0;
if (msg.Equals(accept_msg))
{
using (BinaryWriter writer = new BinaryWriter(
File.Create(Path.Combine(path, file))))
{
while (true)
{
byte[] buffer = new byte[1024];
int read = stream.Read(buffer, 0, 1024);
writer.Write(buffer, 0, read);
if (read == 0)
break;
// Verarbeiten der Dateigröße für z. B. ProgressBar
//s_read += read;
//int pc = (int)((((double)s_read) / ((double)s_length)) * 100);
//if (pc % 5 == 0)
// Percentage = pc;
}
}
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortDateString()
+ DateTime.Now.ToShortTimeString()
+ string.Format(" '{0}' successfully written..", Path.Combine(path, file)));
}
else
System.Diagnostics.Debug.WriteLine(
string.Format("File not accepted by server..."));
stream.Close();
client.Close();
System.Diagnostics.Debug.WriteLine(string.Format("Exit..."));
}
Der Client ist ein Windows Form. Wenn der Download beendet ist (das sieht man ja im Explorer), bleibt die Client Routine immer in der Zeile "writer.Write(buffer, 0, read);" hängen und springt erst garnicht zu "successfully written", während auf dem Server die Funktion richtig durchläuft und er Erfolg vermeldet.
Kann mir da jemand mit neutralem Auge helfen?
Viele Grüße
Sebastian
ich habe ein kleines Problem mit der Übertragung von Dateien via TCP/IP. Ich mir die angehängte Datei aus einem Post (http://www.tutorials.de/forum/net-a...ne-datei-zu-einem-programm-2.html#post1092721) als Vorlage genommen und wollte dann entsprechend weiter gehen und es mit dem umgekehrten Weg versuchen.
Also nicht: Client bietet Server Datei an und Server sagt "ja, die nehme ich" und der Upload wird freigegeben
Sondern: Client fordert Datei bei Server an, Server sagt "Passt scho" und der Download beginnt.
Mit dem Download an sich habe ich keine Probleme, nur der Beendigung des Stream. Da bleibt mit das Programm immer hängen. Habe jetzt zu lange auf den Quellcode geschaut und kann ihn nicht mehr fehlerneutral betrachten, eine neutrale Fehlerhilfe wäre mir sehr willkommen.
Hier ist der Code des Servers zum Senden der Datei (der Code läuft ohne Probleme durch, also das versenden der Datei wird einwandfrei beendet und er meldet mir auch nacher "successfully send"):
private void sendFile(NetworkStream stream, string filename)
{
FileStream fstream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
long s_length = fstream.Length;
long s_read = 0;
// Übertragen der Dateigröße zur Verarbeitung auf Client
//send(stream, "LENGTH " + s_length);
using (BinaryReader reader = new BinaryReader(fstream))
{
while (s_length > s_read)
{
byte[] buffer = new byte[1024];
int read = reader.Read(buffer, 0, 1024);
s_read += read;
sendBuffer(stream, buffer, read);
//int pc = (int)((((double)s_read) / ((double)s_length)) * 100);
//if (pc % 5 == 0)
// Percentage = pc;
}
}
stream.Flush();
Console.WriteLine(DateTime.Now.ToLocalTime()
+ " '{0}' successfully send..", filename);
}
Hier der Code des Clients (Dateiübertragung einwandfrei, lässt sich auch öffnen - ich hatte eine Accessdatei zum testen übertragen) aber der stream wird nicht beendet):
public void LoadFile(string path, string file)
{
TcpClient client = new TcpClient();
client.Connect(m_server, m_port);
NetworkStream stream = client.GetStream();
sendMsg(stream, "GET " + file);
string msg = readMsg(stream);
string accept_msg = "OK " + file;
System.Diagnostics.Debug.WriteLine(string.Format("Ready '{0}' - Receiving '{1}'",
msg, accept_msg));
// Annahme der Dateigröße zur Verarbeitung für z. B. ProgressBar
//string length = readMsg(stream);
//long s_length = Convert.ToInt64(length.Substring(7, length.Length - 7));
//long s_read = 0;
if (msg.Equals(accept_msg))
{
using (BinaryWriter writer = new BinaryWriter(
File.Create(Path.Combine(path, file))))
{
while (true)
{
byte[] buffer = new byte[1024];
int read = stream.Read(buffer, 0, 1024);
writer.Write(buffer, 0, read);
if (read == 0)
break;
// Verarbeiten der Dateigröße für z. B. ProgressBar
//s_read += read;
//int pc = (int)((((double)s_read) / ((double)s_length)) * 100);
//if (pc % 5 == 0)
// Percentage = pc;
}
}
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortDateString()
+ DateTime.Now.ToShortTimeString()
+ string.Format(" '{0}' successfully written..", Path.Combine(path, file)));
}
else
System.Diagnostics.Debug.WriteLine(
string.Format("File not accepted by server..."));
stream.Close();
client.Close();
System.Diagnostics.Debug.WriteLine(string.Format("Exit..."));
}
Der Client ist ein Windows Form. Wenn der Download beendet ist (das sieht man ja im Explorer), bleibt die Client Routine immer in der Zeile "writer.Write(buffer, 0, read);" hängen und springt erst garnicht zu "successfully written", während auf dem Server die Funktion richtig durchläuft und er Erfolg vermeldet.
Kann mir da jemand mit neutralem Auge helfen?
Viele Grüße
Sebastian