ERLEDIGT
NEIN
NEIN
ANTWORTEN
4
4
ZUGRIFFE
818
818
EMPFEHLEN
-
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 weiterhinGeändert von s8jascho (22.08.11 um 13:28 Uhr) Grund: Fehler in Servercode, Zeile 78 & 134
-
Hmmm, hat sich das schonmal wer angeschaut und ausprobiert? Funktioniert das bei euch eventuell sogar?
-
Ehrlich gesagt seh ich da nicht durch.
Du sagst:
Wieso wird die testFile.txt dann auf Server Seite eingelesen ?Ich habe im Ordner des Programms vom Client eine 16KB große Datei die übertragen werden soll
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.
-
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.
-
Ja aber welchen Stream denn? Du sendest ja garnichts.öffne die Datei mit gleichem Namen auf der Serverseite und schreibe da dann den Stream rein
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
-
VPN client(vl auch server-Client) programmieren[C#/Java]
Von Doomt im Forum Coders TalkAntworten: 5Letzter Beitrag: 18.02.10, 08:41 -
VPN Server - Netzwerk-Client kann nicht mit VPN-Client komunizieren
Von Redskin im Forum NetzwerkeAntworten: 4Letzter Beitrag: 08.11.09, 10:55 -
Client-Server-Client Verbindung
Von wSam im Forum JavaAntworten: 1Letzter Beitrag: 05.07.06, 21:53 -
Samba-File-Server Rechte erzwingen für Win-Client
Von Randolph_D im Forum Linux & UnixAntworten: 1Letzter Beitrag: 23.10.05, 09:10 -
Client Server verbindung.: Nachricht an einzelnen Client?
Von lukelukeluke im Forum JavaAntworten: 2Letzter Beitrag: 23.05.05, 22:30





Zitieren
Login





