2010-12-13 3 views
1

Ich erhalte die folgende Ausnahme, wenn ein Client eine Verbindung zum TCPListener herstellt.Hilfe mit Ausnahme mit TCPListener

Ausnahme:

System.ObjectDisposedException: kann ein angeordnete Objekt zugreifen.

Objektname: 'System.Net.Sockets.NetworkStream'.

bei System.Net.Sockets.NetworkStream.Read (Byte [] Puffer, Int32 Offset, Int32 size)

bei Test.Server.ProcessClient (Object-Client, Object clientId)


Server.cs

public class Server 
{ 
    private TcpListener tcpListener; 
    private Thread listenThread; 

    public event EventHandler<EventLogArgs> EventLog; 

    public Server() 
    { 
     // Startup Code 
     ThreadPool.SetMinThreads(50, 50); 
    } 

    void UpdateEventLog(EventLogArgs e) 
    { 
     if (EventLog != null) 
     { 
      EventLog(this, e); 
     } 
    } 

    public void Start(string ip, int port_num) 
    { 
     Globals.listen = true; 

     Int32 port = port_num; 
     IPAddress address = IPAddress.Parse(ip); 

     this.tcpListener = new TcpListener(address, port); 

     Socket listenerSocket = this.tcpListener.Server; 

     LingerOption lingerOption = new LingerOption(true, 10); 
     listenerSocket.SetSocketOption(SocketOptionLevel.Socket, 
          SocketOptionName.Linger, 
          lingerOption); 

     this.listenThread = new Thread(ListenForClients); 
     this.listenThread.Start(); 

     UpdateEventLog(new EventLogArgs("Started server...")); 
    } 

    public void Stop() 
    { 
     Globals.listen = false; 
     UpdateEventLog(new EventLogArgs("Stop server request sent...")); 
    } 

    private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (Globals.listen) 
     { 
      if (!this.tcpListener.Pending()) 
      { 
       // This is so we can stop the server. 
       Thread.Sleep(25); // choose a number (in milliseconds) that makes sense 
       continue; // skip to next iteration of loop 
      } 

      //blocks until a client has connected to the server 
      TcpClient client = this.tcpListener.AcceptTcpClient(); 

      Globals.clientRequests++; 
      int clientRequest = Globals.clientRequests; 
      UpdateEventLog(new EventLogArgs("(" + Globals.clientRequests + ") Client connected...\r\n")); 

      ThreadPool.QueueUserWorkItem(o => ProcessClient(client, clientRequest)); 
     } 

     UpdateEventLog(new EventLogArgs("Stopped server!")); 
     this.tcpListener.Stop(); 
    } 

    private void ProcessClient(object client, object clientId) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     int clientRequestId = (int)clientId; 
     NetworkStream clientStream = tcpClient.GetStream(); 

     byte[] clientRequestRaw = new byte[1024]; 
     int bytesRead; 

     UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Process client request...")); 

     while (true) 
     { 
      bytesRead = 0; 
      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(clientRequestRaw, 0, 512); 
      } 
      catch 
      { 
       //a socket error has occured 
       UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") SOCKET ERROR\r\n\r\n" + e)); 
       break; 
      } 
      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Client disconnected from server, nothing sent.")); 
       break; 
      } 

      //message has successfully been received. 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      string clientRequest = encoder.GetString(clientRequestRaw, 0, bytesRead); 

      string[] cmd; 
      string success; 
      Dictionary<string, string> headers = new Dictionary<string, string>(); 
      Dictionary<string, string> contents = new Dictionary<string, string>(); 

      if (clientRequest.Length == 0) 
      { 
       return; 
      } 

      // Parse HTTP request 
      Parse Parse = new Parse(); 
      Parse.HTTPRequest(clientRequest, out success, out cmd, out headers, out contents); 

      string response; 
      if (success == "TRUE") 
      { 
       response = "HTTP/1.1 200 OK\r\n\r\nHello World!\r\n"; 
      } 
      else 
      { 
       response = "HTTP/1.1 200 OK\r\n\r\nHello Error!\r\n"; 
      } 


      ResponseToClient(client, response); 
      clientStream.Close(); 

      UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Server response...\r\n\r\n" + response)); 
     } 

     tcpClient.Close(); 

     UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Client disconnected.")); 
    } 

    private void ResponseToClient(object client, string response) 
    { 
     TcpClient tcpClient = (TcpClient)client; 
     NetworkStream clientStream = tcpClient.GetStream(); 
     ASCIIEncoding encoder = new ASCIIEncoding(); 
     byte[] buffer = encoder.GetBytes(response); 

     clientStream.Write(buffer, 0, buffer.Length); 
     clientStream.Flush();    
    } 
} 

Die Server-Klasse wird von dem Haupt-Thread wie so begonnen:

this.server = new Server(); 
this.server.EventLog += new EventHandler<EventLogArgs>(UpdateEventLog); 
ThreadPool.QueueUserWorkItem(o => this.server.Start("127.0.0.1", 3000)); 

Was mache ich falsch hier?

Antwort

0

Sie müssen das Netzwerk richtigen Service geben.
Schreiben Sie services.msc in run, dann finden Sie Ihren Service. YourService-> Eigenschaften-> Anmelden-> Anmelden als Netzwerk

1

Ich habe die While-Schleife aus der ProcessClient() Methode genommen und dies scheint das Problem behoben zu haben. Danke trotzdem.

private void ProcessClient(object client, object clientId) 
{ 
    TcpClient tcpClient = (TcpClient)client; 
    int clientRequestId = (int)clientId; 
    NetworkStream clientStream = tcpClient.GetStream(); 

    byte[] clientRequestRaw = new byte[1024]; 
    int bytesRead; 

    UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Process client request...")); 

    while (true) 
    { 
     bytesRead = 0; 

     try 
     { 
      //blocks until a client sends a message 
      bytesRead = clientStream.Read(clientRequestRaw, 0, 512); 
     } 
     catch (Exception e) 
     { 
      //a socket error has occured 
      UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") SOCKET ERROR\r\n\r\n" + e)); 
      break; 
     } 

     if (bytesRead == 0) 
     { 
      //the client has disconnected from the server 
      UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Client disconnected from server, nothing sent.")); 
      break; 
     } 

     //message has successfully been received. 
     ASCIIEncoding encoder = new ASCIIEncoding(); 
     string clientRequest = encoder.GetString(clientRequestRaw, 0, bytesRead); 

     string[] cmd; 
     string success; 
     Dictionary<string, string> headers = new Dictionary<string, string>(); 
     Dictionary<string, string> contents = new Dictionary<string, string>(); 

     if (clientRequest.Length == 0) 
     { 
      return; 
     } 

     // Parse HTTP request 
     Parse Parse = new Parse(); 
     Parse.HTTPRequest(clientRequest, out success, out cmd, out headers, out contents); 

     string response; 
     if (success == "TRUE") 
     { 
      response = "HTTP/1.1 200 OK\r\n\r\nHello World!\r\n"; 
     } 
     else 
     { 
      response = "HTTP/1.1 200 OK\r\n\r\nHello Error!\r\n"; 
     } 

     ResponseToClient(client, response); 

     clientStream.Close(); 

     UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Server response...\r\n\r\n" + response)); 
    } 

    tcpClient.Close(); 

    UpdateEventLog(new EventLogArgs("(" + clientRequestId + ") Client disconnected.")); 
} 
0

Da Sie Ihr Problem gelöst Ich bin Ihnen zwei Hinweise nur gonna geben:

Zunächst einmal verwenden Sie nicht den Thread-Pool synchrone Operationen asynchron zu machen. Es ist eine Verschwendung von Ressourcen. Verwenden Sie stattdessen die asynchronen Methoden (BeginAccept/EndAccept etc).

Als nächstes brechen Sie Ihre Klasse in mehrere Klassen. Einer kümmert sich nur um die Server-Teile und einer kümmert sich nur um die Client-Teile. Es macht Ihren Code viel einfacher zu folgen (sogar für Sie :)).

0

Auf keinen Fall if (success == "TRUE") verwenden!