Hi,
Ich schreibe gerade an einem simplen "Datei senden"-Programm in C#. Dabei habe ich 2 fast identische Versionen.
1. Version:
Funktionert einwandfrei!
2. Version:
Funktioniert nicht einwandfrei, sondern weist einen sehr seltsamen Fehler auf.
Der Unterschied zwischen beiden Versionen ist legidlich, dass ich bei der 2. Version nicht sofort auf der Serverseite die Datei empfange, sondern erst eine Statusanweisung ala "/sendFile", welche vom Client geschickt wird, zunächst abfrage, und dann erst eine entsprechene sendFile() Methode auf dem Server aufrufe, welche die Datei empfängt.
Der Hintergrund ist einfach, dass ich später vom Client auch Daten löschen, runterladen oder eben senden/hochladen können will. Daher diese Statusanweisungen.
Das seltsame ist nun, dass bei der 2. Version die Datei nicht vollständig empfangen wird, sondern der Server mitten im Empfangsprozess plötzlich aufhört. Das Programm hängt sich nicht auf, es gibt keine Exceptions, es hört einfach auf....
Die Stellen, um die es hier geht bzw. in denen der Fehler liegen muss, habe ich mit
Blöcken umrahmt. Bei der 1. Version des Clients ist dieser leer, das ist schon richtig so.
Ich verstehe nicht im geringsten, wo da der Fehler liegen soll?! O.o
Im Anhang sind die Ausgaben beider Versionen angehangen.
P.S.
Ja ich nutze keine using-Anweisungen, aber darin liegt es nicht. Version 1 funktioniert ja einwandfrei.
1. Version - Server:
1. Version - Client:
Ausgabe:
2. Version - Server (Nur was sich geändert hat):
2. Version - Client (Nur was sich geändert hat):
Ausgabe: (Wie man sieht, hört er mitten drinnen plötzlich auf....Warum auch immer)
Ich schreibe gerade an einem simplen "Datei senden"-Programm in C#. Dabei habe ich 2 fast identische Versionen.
1. Version:
Funktionert einwandfrei!
2. Version:
Funktioniert nicht einwandfrei, sondern weist einen sehr seltsamen Fehler auf.
Der Unterschied zwischen beiden Versionen ist legidlich, dass ich bei der 2. Version nicht sofort auf der Serverseite die Datei empfange, sondern erst eine Statusanweisung ala "/sendFile", welche vom Client geschickt wird, zunächst abfrage, und dann erst eine entsprechene sendFile() Methode auf dem Server aufrufe, welche die Datei empfängt.
Der Hintergrund ist einfach, dass ich später vom Client auch Daten löschen, runterladen oder eben senden/hochladen können will. Daher diese Statusanweisungen.
Das seltsame ist nun, dass bei der 2. Version die Datei nicht vollständig empfangen wird, sondern der Server mitten im Empfangsprozess plötzlich aufhört. Das Programm hängt sich nicht auf, es gibt keine Exceptions, es hört einfach auf....
Die Stellen, um die es hier geht bzw. in denen der Fehler liegen muss, habe ich mit
Code:
// ####################################################################
Ich verstehe nicht im geringsten, wo da der Fehler liegen soll?! O.o
Im Anhang sind die Ausgaben beider Versionen angehangen.
P.S.
Ja ich nutze keine using-Anweisungen, aber darin liegt es nicht. Version 1 funktioniert ja einwandfrei.
1. Version - Server:
Code:
namespace FTP___Server_v2 {
public class Server {
private IPAddress ipadress;
private TcpListener serverconnection;
private TcpClient clientconnection;
public NetworkStream nws { get; set; }
public StreamReader sr { get; set; }
public StreamWriter sw { get; set; }
public Server() {
startServer();
waitForClient();
}
public void startServer() {
ipadress = IPAddress.Parse("127.0.0.1");
serverconnection = new TcpListener(ipadress, 5555);
serverconnection.Start();
}
public void waitForClient() {
Console.WriteLine("Server startet. Waiting for incoming client connections...");
clientconnection = serverconnection.AcceptTcpClient();
nws = clientconnection.GetStream();
sr = new StreamReader(nws);
sw = new StreamWriter(nws);
Console.WriteLine("Client connected with Server!");
receiveMessage();
}
public void receiveMessage() {
// ####################################################################
sendFile();
// ####################################################################
}
public void sendFile() {
// Recieve filename
string filename = sr.ReadLine().Remove(0, 10);
// Recieve filesize
long filesize = Convert.ToInt64(sr.ReadLine().Remove(0, 10));
Console.WriteLine("Filename: " + filename);
Console.WriteLine("Filesize: " + filesize);
long count = filesize;
Byte[] fileBytes = new Byte[1024];
var a = File.OpenWrite(filename);
while (count > 0) {
int recieved = nws.Read(fileBytes, 0, fileBytes.Length);
Console.WriteLine("recieved = " + recieved);
nws.Flush();
a.Write(fileBytes, 0, recieved);
a.Flush();
count -= recieved;
}
a.Dispose();
Console.WriteLine("File was written on HDD. Finish!");
Console.ReadLine();
}
}
}
1. Version - Client:
Code:
namespace FTP___Client_v2 {
public partial class Form1 : Form {
public string name { get; set; }
public TcpClient clientConnection { get; set; }
public NetworkStream nws { get; set; }
public StreamReader sr { get; set; }
public StreamWriter sw { get; set; }
public int sizeOfConnectedClients { get; set; }
public string clientnamelistString { get; set; }
public Form1() {
InitializeComponent();
connectToServer();
}
private void btnUpload_Click(object sender, EventArgs e) {
OpenFileDialog ofd = new OpenFileDialog();
string filename = null;
string filepath = null;
if (ofd.ShowDialog() == DialogResult.OK) {
filename = System.IO.Path.GetFileName(ofd.FileName);
//tbFilename.Text = System.IO.Path.GetFileName(ofd.FileName);
filepath = ofd.FileName;
//tbFilesize.Text = (new FileInfo(ofd.FileName).Length).ToString() + " KB";
}
Console.WriteLine("filename: " + filename);
var a = File.OpenRead(filepath);
FileInfo fo = new FileInfo(filepath);
long filesize = fo.Length;
Console.WriteLine("Filesize: " + filesize);
// ####################################################################
// ####################################################################
// Send filename to server
sw.WriteLine("Filename: " + filename);
sw.Flush();
// Send filesize to server
sw.WriteLine("Filesize: " + filesize);
sw.Flush();
// Write file into fileBytes-Array and sends it in parts
Byte[] fileBytes = new Byte[1024];
long count = filesize;
while (count > 0) {
int recieved = a.Read(fileBytes, 0, fileBytes.Length);
a.Flush();
nws.Write(fileBytes, 0, recieved);
nws.Flush();
count -= recieved;
}
Console.WriteLine("File sends!");
}
public void connectToServer() {
Console.WriteLine("connect to server...");
clientConnection = new TcpClient();
IPAddress ipadress = IPAddress.Parse("127.0.0.1");
clientConnection.Connect(ipadress, 5555);
Console.WriteLine("connected to server!");
nws = clientConnection.GetStream();
sr = new StreamReader(nws);
sw = new StreamWriter(nws);
}
}
}
Ausgabe:
2. Version - Server (Nur was sich geändert hat):
Code:
public void receiveMessage() {
// ####################################################################
string receivedMessage = sr.ReadLine();
switch (receivedMessage) {
case "/sendFile": {
sendFile();
break;
}
default: {
Console.WriteLine("Received undefined message: " + receivedMessage);
break;
}
}
// ####################################################################
}
2. Version - Client (Nur was sich geändert hat):
Code:
private void btnUpload_Click(object sender, EventArgs e) {
//...
// ####################################################################
sw.WriteLine("/sendFile");
sw.Flush();
// ####################################################################
//...
}