ERLEDIGT
JA
JA
ANTWORTEN
20
20
ZUGRIFFE
8193
8193
EMPFEHLEN
-
Hallo
Ich hoffe einer von euch kann mir Helfen. Es geht darum, ich möchte gerne ein Programm schreiben bzw. 2 Programme. Diese sollen Dateien untereinander Austauschen können. Also mit anderen Worten, mit dem einen Programm "Server" schicke ich eine X - Beliebige Datei zu dem "client" welcher diese Datei daraufhin empfängt. Wie mache ich dies ambesten? Mit Sockets? Beide Programme sollen mal als Server fungieren und mal als Client.
Kann mir einer ein Tipp geben wie ich das am besten / am einfachsten Lösen kann?
Grüße und vielen Dank
-
Schau dir die Klassen und Beispiele in der MSDN zu TcpClient und TcpListener an ... sollte dir weiterhelfen.
-
Vielen Dank für deine Antwort ich werde mich mal damit richtig auseinandersetzen. Diese sieht sehr vielversprechend aus.
GrüßeGeändert von Fridulin (28.06.05 um 10:47 Uhr)
-
Ich habe mir jetzt die Klassen zu gemüte geführt und auch einigermaßen verstanden, nur wie sende ich jetzt Daten. Ich finde bei MSDN auch keine TcpServer Klasse.
Grüße und Danke
--- Edit oder brauch man das nicht ---
// Create a TcpClient.
// Note, for this client to work you need to have a TcpServer
Diese aussage verwirrt mich ein wenig. Normalerweise sollte man doch damit ne verbindung aufbauen?
Code :1
stream.Write(data, 0, data.Length);
Geändert von Fridulin (28.06.05 um 12:40 Uhr)
-
TcpListener -> Server
TcpClient -> Client
Stream.Write: Du verwendest einen Stream, in den du Daten schreibst. Der TcpListener oder auch der Client empfangen diesen. Die Daten musst du dann auslesen und entsprechend behandeln.
-
Achso ist das, Danke.
Ist aber sehr complex das ganze. Vorallem bei MSDN beschrieben....
Eventuell ein gut kommentiertes Beispiel, oder eine andere kleine Hilfestellung wüßtest du nicht zufällig?
Es ist ja auch unschön, wenn man nur ein Server oder nur ein Client Programmiert hat. Dann kann man es ja garnicht Testen.
Grüße
-
TcpListener:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
class MyTcpListener { public static void Main() { try { // Set the TcpListener on port 13000. Int32 port = 13000; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // TcpListener server = new TcpListener(port); TcpListener server = new TcpListener(localAddr, port); // Start listening for client requests. server.Start(); // Buffer for reading data Byte[] bytes = new Byte[256]; String data = null; // Enter the listening loop. while(true) { Console.Write("Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also user server.AcceptSocket() here. TcpClient client = server.AcceptTcpClient(); Console.WriteLine("Connected!"); data = null; // Get a stream object for reading and writing NetworkStream stream = client.GetStream(); int i; // Loop to receive all the data sent by the client. while((i = stream.Read(bytes, 0, bytes.Length))!=0) { // Translate data bytes to a ASCII string. data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); Console.WriteLine(String.Format("Received: {0}", data)); // Process the data sent by the client. data = data.ToUpper(); byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); // Send back a response. stream.Write(msg, 0, msg.Length); Console.WriteLine(String.Format("Sent: {0}", data)); } // Shutdown and end connection client.Close(); } } catch(SocketException e) { Console.WriteLine("SocketException: {0}", e); } Console.WriteLine("\nHit enter to continue..."); Console.Read(); } }
TcpClient:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
public void Connect(String server, String message) { try { // Create a TcpClient. // Note, for this client to work you need to have a TcpServer // connected to the same address as specified by the server, port // combination. Int32 port = 13000; TcpClient client = new TcpClient(server, port); // Translate the passed message into ASCII and store it as a Byte array. Byte[] data = System.Text.Encoding.ASCII.GetBytes(message); // Get a client stream for reading and writing. // Stream stream = client.GetStream(); NetworkStream stream = client.GetStream(); // Send the message to the connected TcpServer. stream.Write(data, 0, data.Length); Console.WriteLine("Sent: {0}", message); // Receive the TcpServer.response. // Buffer to store the response bytes. data = new Byte[256]; // String to store the response ASCII representation. String responseData = String.Empty; // Read the first batch of the TcpServer response bytes. Int32 bytes = stream.Read(data, 0, data.Length); responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); Console.WriteLine("Received: {0}", responseData); // Close everything. client.Close(); } catch (ArgumentNullException e) { Console.WriteLine("ArgumentNullException: {0}", e); } catch (SocketException e) { Console.WriteLine("SocketException: {0}", e); } Console.WriteLine("\n Press Enter to continue..."); Console.Read(); }
-
Nochmal herzlichen Dank, ich habe sie jetzt beide mit WindowsForms zum laufen gebracht. Ich versuche nun gerade ne Lösung zu finden, wenn die übertragung fertig ist, daß der Listener sich schließt und danach Probiere ich denn mal eine Datei zu senden.
Grüße und Danke nochmals
-
PS: Den Sourcecode den du von mir erhalten hast, ist aus der MSDN. Zu finden direkt beim TcpListener und beim TcpClient ....
-
Ich hatte den unter anderem dort ehrlich gesagt auch gesehen, wußte nur nichts damit anzufanngen. Dort waren mehrere Bruchstücke von dem Programm. Habe die Suche benutzt und wurde von den Stücken zugeschmißen und ich habe dann nicht mehr durchgesehen.
Aber dank dir wo du es so übersichtlich rauskopiert hast, habe ichs einigermaßen durschaut
Grüße
-
Ich glaube ich könnte noch einmal deine Hilfe gut grbauchen. Es geht darum eine Datei zu schicken. Gehe ich recht von in der Anahme, daß man sie erstmal auslesen muß, also folgendermaßen:
Code :1 2 3 4 5 6 7 8 9 10 11
[b][color=#ff0000]int [/color][/b][color=#ff0000][/color]i [color=#006400]= [/color][color=#00008b]0[/color][color=#006400];[/color] StreamReader lesen [color=#006400]= [/color][b][color=#008b8b]new [/color][color=#191970]StreamReader[/color][/b][color=#191970][/color][color=#006400]([/color][color=#ff00ff]"c:\test.txt"[/color][color=#006400], [/color][b][color=#008b8b]true[/color][/b][color=#008b8b][/color][color=#006400]);[/color] lesen[color=#006400].[/color]BaseStream[color=#006400].[/color][b][color=#191970]Seek[/color][/b][color=#191970][/color][color=#006400]([/color][color=#00008b]0[/color][color=#006400],[/color]SeekOrigin[color=#006400].[/color]Begin[color=#006400]); [/color] [color=#ff0000]string [/color][color=#006400][] [/color]arrZeilen [color=#006400]= [/color][b][color=#008b8b]new [/color][/b][color=#008b8b][/color][color=#ff0000]string [/color][color=#006400][[/color][color=#00008b]1000[/color][color=#006400]];[/color] [b][color=#0000ff]while [/color][/b][color=#0000ff][/color][color=#006400]([/color]lesen[color=#006400].[/color][b][color=#191970]Peek[/color][/b][color=#191970][/color][color=#006400]() != -[/color][color=#00008b]1[/color][color=#006400])[/color] [color=#006400]{[/color] arrZeilen[color=#006400][[/color]i[color=#006400]] = [/color]lesen[color=#006400].[/color][b][color=#191970]ReadLine[/color][/b][color=#191970][/color][color=#006400]();[/color] i[color=#006400]++; [/color] [color=#006400]}[/color] Byte[color=#006400][] [/color]data2 [color=#006400]= [/color]System[color=#006400].[/color]Text[color=#006400].[/color]Encoding[color=#006400].[/color]ASCII[color=#006400].[/color][b][color=#191970]GetBytes[/color][/b][color=#191970][/color][color=#006400]([/color]arrZeilen[color=#006400][[/color]i[color=#006400]]);[/color] [size=1][color=#006400][size=2][/size][/color][/size]
in soweit Funktioniert es auch nur wenn ich die letzte Zeile Byte[] data2... mit in die While schleife packe, erkennt er sie ja nachher nicht mehr:
Code :1
Code :1
Code :1 2
[size=1][color=#006400][size=2]stream[color=#006400].[/color][b][color=#191970]Write[/color][/b][color=#191970][/color][/size][size=2][color=#006400]([/color]data2[color=#006400], [/color][color=#00008b]0[/color][color=#006400], [/color]data[color=#006400].[/color]Length[color=#006400]);[/color][/size] [size=1][color=#006400][size=2][/size][/color][/size][/color][/size]
Oder gehe ich das ganze Komplett falsch an, nacher sollen es ja auch keine Textdateien mehr Sein die er schickt, nur so nebnbei erwähnt.
Oder muß ich jeden einzelnen durchganz verschicken? D.h. eine Zeile der Datei Lesen > und dann absenden > Lesen > Absenden?
Grüße und vielen Dank
-
28.06.05 15:27 #12
- Registriert seit
- May 2005
- Beiträge
- 33
Hi!
Hast du es schonmal mit der BlockCopy-Methode versucht, damit kann man eigentlich ganz elegant viele Arten von Arrays in Byte-Blöcke kopieren. Die Methode gehört zur Buffer-Klasse, vielleicht machst du dich da mal schlau oder probierst es hiermit:
[CODE]
string [] arrZeilen = new string [1000];
for(...)
Byte[] data2=new byte[Buffer.ByteLength(arrZeilen)];
Buffer.BlockCopy(arrZeilen,0,data2,0,data2.Length);
myStream.Write(data2,0,data2.Length);
Gruß
MC
-
Hi, Danke für deine Antwort. Habe deine Lösung mal eben ausprobiert. Ich bekomme dann die Fehlermeldung Object must be an array of primitives, weißt du was das bedeutet?
Grüße
-
Ich habe es mit einer Textdatei geschafft diese zu versenden. Jetzt möchte ich aber gerne ein anderen Typ verschicken, wenn ich dies mit meiner Funktion versuche erscheint folgende Fehlermeldung:
String referenze not set to an instance of a string. Und ich habe keine Ahnung was das Bedeutet.
Hast du oder eventuell noch ein anderer, wie ich ambesten eine x Beliebige Datei einlesen kann? evt. Mit dem ByteReader? Habe ich irgendwo mal gelesen....
Grüße
-
Hi,
machs einfach so:
Code :1 2 3 4 5 6 7 8
byte[] buffer = new byte[1024]; int bytesRead; using(FileStream fs = new FileStream("test.txt", FileMode.Open)) while( (bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0 ) stream.Write(buffer, 0, bytesRead); stream.Flush();
Ähnliche Themen
-
Einem PHP-Skript auf einem XAMPP Schreibzugriff auf eine Datei gestatten
Von WiZdooM im Forum Hosting & WebserverAntworten: 0Letzter Beitrag: 23.10.09, 12:42 -
über VB eine Datei auslesen und das nicht in einem MS Programm
Von esilein im Forum Visual Basic 6.0Antworten: 3Letzter Beitrag: 13.11.08, 13:51 -
C#: Datei einem Programm zuweisen
Von MrDisaster im Forum Sonstige SprachenAntworten: 0Letzter Beitrag: 15.06.07, 17:20 -
von einem java Programm auf eine .jar datei zugreifen
Von Paddelente im Forum JavaAntworten: 12Letzter Beitrag: 22.04.07, 09:03 -
Wie verknüpft windows eine Datei mit einem Programm
Von Meex im Forum C/C++Antworten: 4Letzter Beitrag: 21.03.05, 11:08





Zitieren
Login




