Laden...

Daten senden

Erstellt von alf468 vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.108 Views
A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren
Daten senden

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 ?

3.728 Beiträge seit 2005
vor 18 Jahren
Klar

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.

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

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??

F
529 Beiträge seit 2003
vor 18 Jahren

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

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

Wie kann ich die Datei den in ein Byte[] zerlegen und wieder zusammenfügen?

F
529 Beiträge seit 2003
vor 18 Jahren

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

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

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.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Schau mal System.Text.Encoding an. Da gibts Funktionen zum Konvertieren von Bytes in char und umgekehrt.

4.221 Beiträge seit 2005
vor 18 Jahren

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...

A
alf468 Themenstarter:in
196 Beiträge seit 2005
vor 18 Jahren

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 ?!

4.221 Beiträge seit 2005
vor 18 Jahren

@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...