tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
818
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    s8jascho s8jascho ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    16
    Hallo.

    Ich habe mal wieder ein Problem.
    Ich habe einen TCP-Server und einen dazugehörigen Client. Erst starte ich den Server, dann den Client, die Verbindung wird aufgebaut und dann versuche ich ein Textdatei zu übertragen.
    Der Server sagt er öffnet die Datei, der Client sagt er sendet sie. Ich habe im Ordner des Programms vom Client eine 16KB große Datei die übertragen werden soll.
    Es passiert jedoch nichts. Nach 10 Minuten hat sich auch nichts getan und eigentlich sollten 16KB ja realtiv schnell übertragen werden bei einer Verbindung auf dem eigenen Rechner.

    Vielleicht könnt ihr euch das mal ansehen und vielleicht findet ihr ja auch einen Fehler, mir kommt das alles nämlich sehr seltsam vor.

    Servercode
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;
     
     
    namespace Demo_LAMT_TCPServer_3
    {
        public class AsynchTcpNetworkFileServer
        {
            class ClientHandler
            {
                private const int bufferSize = 256;
                private byte[] buffer;
                private Socket socket;
                private NetworkStream networkStream;
                private Stream inputstream;
                private AsyncCallback callbackRead;
                private AsyncCallback callbackWrite;
                private AsyncCallback myFileCallback;
     
     
                //  Constructor
                public ClientHandler(Socket socketForClient)
                {
                    // initialize member variable
                    socket = socketForClient;
     
                    //  initialize buffer for file content
                    buffer = new byte[256];
     
                    //  create networkStream
                    networkStream = new NetworkStream(socketForClient);
     
                    //  set file callback for reading
                    myFileCallback = new AsyncCallback(this.OnFileCompletedRead);
     
                    //  set callback for reading of network stream
                    callbackRead = new AsyncCallback(this.OnReadComplete);
     
                    //  set callback for writing in network stream
                    callbackWrite = new AsyncCallback(this.OnWriteComplete);
                }
     
     
                //  start reading string from client
                public void StartRead()
                {
                    //  read of network and determine name of file
                    networkStream.BeginRead(
                        buffer,
                        0,
                        buffer.Length,
                        callbackRead,
                        null);
                }
     
                //  show string after reading and send it back to client
                public void OnReadComplete(IAsyncResult asyncResult)
                {
                    int bytesRead = networkStream.EndRead(asyncResult);
     
                    //  if a string comes in ...
                    if (bytesRead > 0)
                    {
                        //  convert string into filename
                        string fileName = Encoding.ASCII.GetString(buffer, 0, bytesRead);
     
                        //  display status on console
                        Console.Write("Öffne Datei {0}", fileName);
     
                        //  open stream for file input
                        inputstream = File.OpenRead(fileName);
     
                        //  start reading file
                        networkStream.BeginRead(
                            buffer,         //  buffer for result
                            0,              //  predefined offset in bytes (0 = no offset)
                            buffer.Length,  //  size of buffer
                            myFileCallback, //  callback delegate
                            null);          //  local object which shows state 
                    }
                    //  if no string comes in ...
                    else
                    {   
                        Console.WriteLine("Leseverbindung beendet");    //  display status at console
                        networkStream.Close();                          //  close network stream
                        socket.Close();                                 //  close socket
                        networkStream = null;                          
                        socket = null;
                    }
                }
     
                // if buffer is full with data
                void OnFileCompletedRead(IAsyncResult asyncResult) 
                {
                    int bytesRead = inputstream.EndRead(asyncResult);
     
                    //  if something got read from file ...
                    if (bytesRead > 0)
                    {
                        //  send it to client
                        networkStream.BeginWrite(
                            buffer,
                            0,
                            bytesRead,
                            callbackWrite,
                            null);
                    }
                    else
                    {
                        Console.WriteLine("Ende");
                        networkStream.Close();
                        socket.Close();
                        networkStream = null;
                        socket = null;
                    }
                }
     
     
                // after successful writing of string begin reading from the start
                private void OnWriteComplete(IAsyncResult asyncResult)
                {
                    networkStream.EndWrite(asyncResult);
                    Console.WriteLine("Schreiben beendet");
     
                    //  start with reading from file
                    networkStream.BeginRead(
                        buffer,         //  Pbuffer for result
                        0,              //  offset
                        buffer.Length,  //  size of buffer
                        myFileCallBack,   //  callback delegate
                        null);          //  local object which show state
                }
     
            }
            public static void Main()
            {
                AsynchTcpNetworkFileServer serverApplication = new AsynchTcpNetworkFileServer();
                serverApplication.Run();
            }
     
            private void Run()
            {
                // create new TcpListener and set to receive at Port 60117
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");
                TcpListener tcpListener = new TcpListener(localAddr, 60117);
                tcpListener.Start();
     
                // continue receiving until the end of file is reached
                for (; ; )
                {
                    // accept if client is connecting, return new socket named socketForClient while tcpListener is receiving
                    Socket socketForClient = tcpListener.AcceptSocket();
                    Console.WriteLine("Client connected");
                    ClientHandler handler = new ClientHandler(socketForClient);
                    handler.StartRead();
                }            
            }
        }
    }


    Clientcode
    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
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net.Sockets;
    using System.IO;
    using System.Threading;
     
    namespace Demo_LAMT_TCPClient_3
    {
        class AsynchTCPNetworkClient
        {
            private const int bufferSize = 256;
            private NetworkStream streamToServer;
     
            static public int Main(string[] args)
            {
                AsynchTCPNetworkClient clientApplication = new AsynchTCPNetworkClient();
                return clientApplication.Run(); 
            }
     
            AsynchTCPNetworkClient()
            {
                string serverName = "localhost";
                Console.WriteLine("Connecting to {0} ...", serverName);
                TcpClient tcpSocket = new TcpClient(serverName, 60117);
                streamToServer = tcpSocket.GetStream();
            }
     
            private int Run()
            {
                string message = "testFile.txt";
                Console.WriteLine("Sending {0} to server...", message);
     
                // create StreamWriter for sending string to Server
                StreamWriter writer = new StreamWriter(streamToServer);
                writer.Write(message);
                writer.Flush();
     
                bool fQuit = false;
     
                while (!fQuit)
                {   
                    //  buffer for response
                    char[] responseBuffer = new char[bufferSize];
     
                    //  read response
                    StreamReader readerToServer = new StreamReader(streamToServer);
     
                    //  look up how many bytes were read
                    int bytesRead = readerToServer.Read(responseBuffer, 0, bufferSize);
                    if (bytesRead == 0) //  if no bytes were read
                        fQuit = true;
                    else                //  if bytes were read
                    {
                        //  Show as string
                        string theString = new String(responseBuffer);
                        Console.WriteLine(theString);
                    }
                }
                streamToServer.Close();
                return 0;
            }
        }
    }

    EDIT: Okay, ich habe einen Fehler gefunden, es macht natürlich keinen Sinn beim Server in Zeile 78 networkStream.BeginRead zu schreiben, das soll inputStream.BeginRead heißen. Nun gibt er mir aus, dass das Schreiben beendet ist, aber es wurde nichts geschrieben, woran kann das liegen?

    Edit2: Zeile 134 muss natürlich myFileCallBack heißen. Fehler besteht weiterhin
    Geändert von s8jascho (22.08.11 um 13:28 Uhr) Grund: Fehler in Servercode, Zeile 78 & 134
     

  2. #2
    s8jascho s8jascho ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    16
    Hmmm, hat sich das schonmal wer angeschaut und ausprobiert? Funktioniert das bei euch eventuell sogar?
     

  3. #3
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    Ehrlich gesagt seh ich da nicht durch.
    Du sagst:
    Ich habe im Ordner des Programms vom Client eine 16KB große Datei die übertragen werden soll
    Wieso wird die testFile.txt dann auf Server Seite eingelesen ?
    Servercode->Zeile 75
    Code :
    1
    
    inputstream = File.OpenRead(fileName);

    Soweit ich das sehen kann ist das einzige was vom client an den Server gesendet wird das hier:
    Code :
    1
    
    string message = "testFile.txt";

    Und das sollte auch ankommen.
     
    In order to understand recursion, one must first understand recursion.

  4. #4
    s8jascho s8jascho ist offline Mitglied
    Registriert seit
    Aug 2011
    Beiträge
    16
    Oh okay. Ich dachte ich übermittle den Dateinamen vom Client an den Server, öffne die Datei mit gleichem Namen auf der Serverseite und schreibe da dann den Stream rein. Das habe ich wohl nicht so hinbekommen.
    Aber so wie du es sagst hast du da wohl Recht, das scheint nicht so zu stimmen und funktioniert daher auch nicht wie gedacht. Jetzt stellt sich mir die Frage wie ich das nun so hinbekomme dass es wie gewünscht funktioniert.
    Vielen Dank erstmal, wenn du mir noch einen Tipp geben kannst wäre ich sehr dankbar, ich glaube ich stehe da auch grad auf dem Schlauch.
     

  5. #5
    Avatar von rd4eva
    rd4eva rd4eva ist offline Mitglied Brillant
    Registriert seit
    Feb 2003
    Beiträge
    756
    öffne die Datei mit gleichem Namen auf der Serverseite und schreibe da dann den Stream rein
    Ja aber welchen Stream denn? Du sendest ja garnichts.

    Der Ablauf sollte doch in etwa folgender sein.
    Ich gehe jetzt mal davon aus das der Client eine beliebige Datei an den Server (nicht der gleiche PC) übermitteln muss.
    1. Client verbindet sich zum Server
    2. Client sendet den Dateinamen an den Server
    3. Server erstellt eine Datei mit dem empfangenen Dateinamen
    4. Client liest die Datei ein
    5. Client sendet den eingelesenen Dateiinhalt an den Server
    6. Server empfängt den Dateiinhalt
    7. Server schreibt den Dateiinhalt in die unter 3. erstellte Datei.
    8. Transfer beendet.
    (9. Optional: Server kehrt in den Ursprungszustand zurück um weitere Dateien entgegen nehmen zu können)
     
    In order to understand recursion, one must first understand recursion.

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 18.02.10, 08:41
  2. Antworten: 4
    Letzter Beitrag: 08.11.09, 10:55
  3. Client-Server-Client Verbindung
    Von wSam im Forum Java
    Antworten: 1
    Letzter Beitrag: 05.07.06, 21:53
  4. Samba-File-Server Rechte erzwingen für Win-Client
    Von Randolph_D im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 23.10.05, 09:10
  5. Antworten: 2
    Letzter Beitrag: 23.05.05, 22:30

Stichworte