tutorials.de Buch-Aktion 02/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
20
ZUGRIFFE
8193
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Schau dir die Klassen und Beispiele in der MSDN zu TcpClient und TcpListener an ... sollte dir weiterhelfen.
     

  3. #3
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    Vielen Dank für deine Antwort ich werde mich mal damit richtig auseinandersetzen. Diese sieht sehr vielversprechend aus.

    Grüße
    Geändert von Fridulin (28.06.05 um 10:47 Uhr)
     

  4. #4
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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)
     

  5. #5
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.
     

  6. #6
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  7. #7
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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();
    }
     

  8. #8
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  9. #9
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    PS: Den Sourcecode den du von mir erhalten hast, ist aus der MSDN. Zu finden direkt beim TcpListener und beim TcpClient ....
     

  10. #10
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  11. #11
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  12. #12
    MC_Straßenköter MC_Straßenköter ist offline Mitglied Bronze
    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
     

  13. #13
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  14. #14
    Fridulin Fridulin ist offline Mitglied Brokat
    Registriert seit
    Dec 2004
    Beiträge
    309
    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
     

  15. #15
    Caracho Caracho ist offline Mitglied Silber
    Registriert seit
    May 2002
    Beiträge
    73
    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

  1. Antworten: 0
    Letzter Beitrag: 23.10.09, 12:42
  2. Antworten: 3
    Letzter Beitrag: 13.11.08, 13:51
  3. C#: Datei einem Programm zuweisen
    Von MrDisaster im Forum Sonstige Sprachen
    Antworten: 0
    Letzter Beitrag: 15.06.07, 17:20
  4. Antworten: 12
    Letzter Beitrag: 22.04.07, 09:03
  5. Antworten: 4
    Letzter Beitrag: 21.03.05, 11:08