Hallo,
vorab: ich nutze VS 2005.
Ich habe mir einen Server in C# geschrieben (Beispiel aus I-Net). Dieser erstellt per anfragenden Client einen Thread und soll erstmal als Echo Server dienen. Folgend, der Code (als Consolen-Anwendung):
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:
| using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Threading; using System.Net; using System.IO;
namespace myServer { class Program { static void Main(string[] args) { Server srv = new Server(); } }
class Server { private TcpListener tcpListener; private Thread listenThread;
public Server() { this.tcpListener = new TcpListener(IPAddress.Any, 3000); this.listenThread = new Thread(new ThreadStart(ListenForClients)); this.listenThread.Start(); }
private void ListenForClients() { this.tcpListener.Start();
while (true) { TcpClient client = this.tcpListener.AcceptTcpClient();
Console.WriteLine("Hello Server");
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm)); clientThread.Start(client); } }
private void HandleClientComm(object client) { TcpClient tcpClient = (TcpClient)client; NetworkStream clientStream = tcpClient.GetStream();
byte[] message = new byte[4096]; int bytesRead;
while (true) { bytesRead = 0;
try { bytesRead = clientStream.Read(message, 0, 4096); } catch(Exception ex) { Console.WriteLine(ex.Message); break; }
if (bytesRead == 0) { break; }
ASCIIEncoding encoder = new ASCIIEncoding();
Console.WriteLine(encoder.GetString(message, 0, bytesRead)); clientStream.Write(message, 0, message.Length);
} tcpClient.Close(); } } } |
Das ganze arbeitet einwandfrei ... ABER:
Nun erweitere ich den Code wie folgt ( bei ####### ERWEITERUNG ######):
C#-Quelltext
1: 2: 3: 4:
| byte[] img = File.ReadAllBytes("c:\\1.jpg"); message = encoder.GetBytes(img.Length+"\n"); clientStream.Write(message, 0, message.Length); |
Das erste mal lesen klappt. Er schickt mir die Dateigrösse rüber. Schicke ich dann aber einen erneuten Request (in Form einer beliebigen Zeichenfolge) schlägt NetworkStream.Read fehl und ich erhalte folgende Fehlermeldung (ex.Message im catch-Block):
Das angegebene Argument liegt außerhalb des gültigen Wertebereichs.
Parametername: size
Hat da jmd. eine Idee? Fange gerade mit c# an und weiss echt nicht mehr, wo ich noch suchen soll. Vorstellen könnte ich mir irgendetwas ungültiges im Eingans oder Ausgangspuffer ... aber wer weiss...
Deswegen frage ich ja hier die Profis
Für jeden Tipp, Kommentar, Lösung, etc ... Herzlichen Dank
Gruß,
littleman