Datei versand. Wie versende ich eine Datei zu einem Programm

Fridulin

Erfahrenes Mitglied
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
 
Vielen Dank für deine Antwort ich werde mich mal damit richtig auseinandersetzen. Diese sieht sehr vielversprechend aus.

Grüße
 
Zuletzt bearbeitet:
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:
	stream.Write(data, 0, data.Length);
 
Zuletzt bearbeitet:
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:
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:
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
 
Zurück