Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Daten senden
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

Themenstarter:

Daten senden

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
Rainbird
myCSharp.de - Experte

Avatar #avatar-2834.jpg


Dabei seit:
Beiträge: 3.728
Herkunft: Mauer

Klar

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

Themenstarter:

beantworten | zitieren | melden

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??
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

Themenstarter:

beantworten | zitieren | melden

Wie kann ich die Datei den in ein Byte[] zerlegen und wieder zusammenfügen?
private Nachricht | Beiträge des Benutzers
Franknstein
myCSharp.de - Member



Dabei seit:
Beiträge: 529

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Schau mal System.Text.Encoding an. Da gibts Funktionen zum Konvertieren von Bytes in char und umgekehrt.
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
alf468
myCSharp.de - Member



Dabei seit:
Beiträge: 196

Themenstarter:

beantworten | zitieren | melden

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 ?!
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

@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...
Attachments
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers