2010-12-13 11 views
1

클라이언트가 TCPListener에 연결할 때 계속 다음 예외가 발생합니다.TCPListener 예외 예외 도움말

예외 :

System.ObjectDisposedException는 : 삭제 된 개체에 액세스 할 수 없습니다.

개체 이름 : 'System.Net.Sockets.NetworkStream'.

System.Net.Sockets.NetworkStream.Read에서 (바이트 [] 버퍼 오프셋 INT32, INT32 사이즈)에 Test.Server.ProcessClient


(객체 클라이언트, 클라이언트 ID 개체)

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();    
    } 
} 

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

내가 잘못 여기서 뭐하는 거지 :

[서버 클래스는과 같이 메인 스레드에서 시작된다?

답변

0

네트워크에 올바른 서비스를 제공해야합니다.
실행중인 services.msc를 작성한 다음 서비스를 찾으십시오. YourService-> Properties-> Log On-> 네트워크로 로그온

1

ProcessClient() 메서드에서 while 루프를 꺼 냈습니다. 문제가 해결 된 것 같습니다. 어쨌든 고마워. 당신은 그냥 거 당신이 힌트를 제공하고있어 문제 해결 이후

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

: 모든

첫째, 동기 작업 비동기를 만들기 위해 스레드 풀을 사용하지 마십시오. 자원 낭비입니다. 대신 비동기 메서드 (BeginAccept/EndAccept 등)를 사용하십시오.

다음은 클래스를 여러 클래스로 나눕니다. 하나는 서버 부품 만 처리하고 다른 하나는 클라이언트 부품 만 처리합니다. 그것은 당신의 코드를 훨씬 더 쉽게 따르도록합니다 (심지어 당신 :);).

0

어쨌든 if (success == "TRUE")을 사용하지 마십시오!