Ich suche jetzt schon die ganze Zeit nach Hinweisen wie man Dateien per NetworkStream versenden kann.
Könnte man eine Datei in byte[] umwandeln.versenden und dann wieder von byte[] in Datei umwandeln ?
Ja das geht mit NetworkStream. Man kann mit StreamReader und StreamWriter den Strom lesen und schreiben. Beispiele findet man in der MSDN Library unter Socket bzw. NetworkStream.
Muss es wirklich Socket-Programmierung sein? .NET Remoting ist bestimmt einfacher zu implementieren. Es kommt natürlich darauf an, was Du machen willst.
Danke Rainbird !
Wenn ich zB eine exe Datei sende wird die nicht richtig übertragen,was sicher am Encoding liegt.
Client:
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse(this._clientdata[i-1].ToString()), 7777 );
NetworkStream stream = client.GetStream();
StreamReader reader = new StreamReader(this.openFileDialog1.FileName,Encoding.ASCII);
StreamWriter writer = new StreamWriter(stream);
writer.Write(reader.ReadToEnd());
writer.Flush();
writer.Close();
reader.Close();
client.Close();
Server:
TcpListener listener = new TcpListener(7777);
listener.Start();
Socket socket = listener.AcceptSocket();
NetworkStream stream = new NetworkStream (socket, FileAccess.ReadWrite,false );
StreamReader reader = new StreamReader(stream,Encoding.ASCII);
StreamWriter writer = new StreamWriter(this.saveFileDialog1.FileName);
writer.Write(reader.ReadToEnd());
writer.Flush();
writer.Close();
reader.Close();
listener.Stop();
Was für ein Coding soll ich da nehmen?
Edit: Hat sich erledigt,habe Default genommen 😁
Gibt es eine Möglichkeit den Status anzeigen zu lassen??
Wenn du den Status der Übertragung meinst, kannst du nur die Bytes mitzählen, die du schon geschrieben hast. Dazu musst du aber deinen Code etwas verändern. Dazu darfst du nämlich die Datei nicht an einem Stück in den Netzwerkstream schicken, sondern musst sie in byte-Arrays aufteilen.(Geht bestimmt auch anders - ich würde das allerdings so tuen)
Besuchen sie das VisualC++ - Forum
Wie kann ich die Datei den in ein Byte[] zerlegen und wieder zusammenfügen?
writer.Write(reader.ReadToEnd());
ersetzt du durch:
byte[] buf = new byte[1024];
while(reader.Peek() != -1)
{
reader.Read(buf, 0, 1024);
stream.Write(buf, 0, 1024);
}
Also, ich habe das jetzt mal so frei Schnautze aufgeschrieben, wie es evtl funktioniert. Es kann natürlich sein, dass irgent welche Parameter zu viel sind(bei dem stream.Write), aber es sollte passen. Guck halt mal ob es funktioniert. Wenn der Code vom Syntax richtig ist, aber der Server nur die ersten 1024 Bytes empfängt, musst du halt dort auch noch eine Schleife bauen, mit der du auch nachfolgende Daten hohlst.
Evtl musst du Binärdaten aber mit Convert.ToBase64String noch in das Base64-Format umwandeln.
Besuchen sie das VisualC++ - Forum
StreamReader erwartet ein char[] aber woher soll ich das nehmen?
Ich habe hier im Forum von dieser Methode gelesen
NetworkStream stream = client.GetStream();
Stream reader = File.OpenRead(this.openFileDialog1.FileName);
byte[] buf = new byte[reader.Length];
reader.Read(buf, 0, buf.Length);
stream.Write(buf, 0, buf.Length);
Ich weiß aber nicht ob dies Richtig ist.
Schau mal System.Text.Encoding an. Da gibts Funktionen zum Konvertieren von Bytes in char und umgekehrt.
Original von alf468
Was für ein Coding soll ich da nehmen?
using(NetworkStream ns=client.GetStream())
{
using (FileStream fs=File.OpenRead("test.txt"))
{
byte[] bytes=new byte[fs.Length];
fs.Read(bytes,0,bytes.Length);
ns.Write(bytes,0,bytes.Length);
}
}
So gehts ohne Reader und Kollegen....
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Also ich habe jetzt folgendes:
Daten empfangen
NetworkStream stream = new NetworkStream (socket, FileAccess.ReadWrite,false);
StreamWriter reader = new StreamWriter(this.saveFileDialog1.FileName,false,Encoding.Default);
byte[] buf = new byte[stream.Length];
stream.Read(buf,0,buf.Length);
reader.Write(Encoding.Default.GetChars(buf));
reader.Close();
Daten senden
TcpClient client = new TcpClient();
client.Connect(ip, 7777 );
NetworkStream stream = client.GetStream();
Stream reader = File.OpenRead(this.openFileDialog1.FileName);
byte[] buf = new byte[reader.Length];
reader.Read(buf, 0, buf.Length);
stream.Write(buf, 0, buf.Length);
stream.Close();
reader.Close();
client.Close();
Bei dem Senden dürfte es keine Fehler geben aber bei Empfangen ist sicher Fehler.
Wobei ich nicht genau verstehe was eigentlich gesendet wird,denn ich sende ja nur buf ?!
@alf486
Ich hab da auf einer Archiv-CD noch ein Beispiel gefunden welches ich vor Urzeiten mal für jemanden gebaut habe welcher über's Internet Peer To Peer Files austauschen wollte.....
Eigentlich ist es mehr nur eine lauffähige Fallstudie... den Code hab ich nicht gereviewt und würde es vermutlich heute auch anders bauen.... aber oh staun er scheint noch zu laufen 🙂
Tipp: Es hat mindestens eine Hart-codierte IP-Adresse drin und auch einen Pfad.... die musst Du für erste Tests halt mal ändern...
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...