2014-07-23 3 views
0

클라이언트 - 서버 응용 프로그램을 작성하고 있습니다. 클라이언트가 명령 및 서버를 전송하여이를 수신하고 조작을 수행합니다. 잘 작동한다. 그러나 서버에서 클라이언트로 응답을 보내고 클라이언트 측에서 응답을 보내려고하면 아무 일도 일어나지 않습니다. 심지어 서버는 아무 것도하지 않습니다. 프로그램이 중단되고 Shift + F5 만 완료하는 데 도움이됩니다.클라이언트 - 서버 응용 프로그램은 서버 C#에서 응답을 얻으려고 할 때 아무 작업도하지 않습니다./

서버 코드 :

class TNPClient 
{ 
    TNPBaseInterraction tnp_base; 

    private void SendError(TcpClient Client, int Code) 
    { 
     byte[] buf = Encoding.ASCII.GetBytes(Code.ToString()); 
     Client.GetStream().Write(buf, 0, buf.Length); 
     Client.Close(); 
    } 

    private void SendResponse(TcpClient Client, string response) 
    { 
     byte[] buf = Encoding.ASCII.GetBytes(response); 
     Client.GetStream().Write(buf, 0, buf.Length); 
     Client.Close(); 
    } 

    void ParseMonitorRequest(TcpClient Client, string req) 
    { 
     MessageBox.Show("inside parser"); 
     int term_id = Convert.ToInt32(req.Substring(2)); 
     switch (req[1]) 
     { 
      case '0': 
       List<MonitorStruct> monitors = tnp_base.GetMonitors(term_id); 
       foreach (MonitorStruct mon in monitors) 
       { 

       } 
       break; 
      case '1': 
       break; 
      case '2': 
       break; 
      case '3': 
       break; 
      case '4': 
       MessageBox.Show("inside 4"); 
       List<TerminalStruct> terminals = tnp_base.GetTerminals(); 
       foreach (TerminalStruct term in terminals) 
       { 
        MessageBox.Show("sending response"); 
        MessageBox.Show(string.Format("ID: {0} Address: {1} Comment: {2}", term.TerminalID, term.Address, term.Comment)); 
        //SendResponse(Client, string.Format("ID: {0} Address: {1} Comment: {2}", term.TerminalID, term.Address, term.Comment)); 
       } 
       break; 
     } 
    } 

    void ParseTerminalRequest(TcpClient Client, string req) 
    { 

    } 

    public TNPClient(TcpClient Client) 
    { 
     try 
     { 
      tnp_base = new TNPBaseInterraction("127.0.0.1", "tnp", "tnp_user", "tnp123", "3406"); 

      string Request = ""; 
      byte[] buf = new byte[1024]; 
      int Count = 0; 
      while ((Count = Client.GetStream().Read(buf, 0, buf.Length)) > 0) 
      { 
       Request += Encoding.ASCII.GetString(buf, 0, Count); 
      } 
      if (Request[0].Equals('0')) 
      { 
       ParseMonitorRequest(Client, Request); 
      } 
      else 
      { 
       ParseTerminalRequest(Client, Request); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception: " + ex.Message); 
     } 
    } 
} 

class TNPServer 
{ 
    TcpListener Listener; 
    int Port = 5252; 

    public TNPServer(int ServerPort) 
    { 
     int MaxThreadsCount = Environment.ProcessorCount * 4; 
     ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount); 
     ThreadPool.SetMinThreads(2, 2); 

     Port = ServerPort; 
    } 

    public void StartServer() 
    { 
     Listener = new TcpListener(IPAddress.Any, Port); 
     Listener.Start(); 
     while (true) 
     { 
      ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(ClientThread), Listener.AcceptTcpClient()); 
     } 
    } 

    static void ClientThread(Object StateInfo) 
    { 
     new TNPClient((TcpClient)StateInfo); 
    } 

    ~TNPServer() 
    { 
     if (Listener != null) 
     { 
      Listener.Stop(); 
     } 
    } 
} 

클라이언트 측 코드 (이 코드는 제공 문제) : 서버 측

try 
{ 
    TcpClient client = new TcpClient("127.0.0.1", 5365); 
    if (client.Connected) MessageBox.Show("Connected"); 
    byte[] buf = Encoding.ASCII.GetBytes(tbSendText.Text); 
    NetworkStream stream = client.GetStream(); 
    stream.Write(buf, 0, buf.Length); 
    // System.Threading.Thread.Sleep(5000); 

    //client.ReceiveTimeout = Convert.ToInt32(TimeSpan.FromSeconds(1).TotalMilliseconds); 
    byte[] buffer = new byte[256]; 
    int Count = 0; 
    string response = string.Empty; 
    // while ((Count = client.GetStream().Read(buffer, 0, buffer.Length)) > 0) 
    //{ 
     Count = stream.Read(buffer, 0, buffer.Length); 
     response = Encoding.ASCII.GetString(buffer, 0, Count); 
    //} 

     stream.Close(); 
    client.Close(); 
    MessageBox.Show(response); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

모든 메시지는 내가 클라이언트 측에서 응답을 얻으려고 노력하고 있지 않다 다음 표시됩니다 . 응답을 얻으려고 할 때 메시지가 표시되지 않지만 연결이 설정됩니다.

답변

1

서버 측에서는 읽기 루프가 영원히 차단됩니다. 텍스트 길이 &까지만 읽은 다음 요청을 구문 분석해야합니다. 클라이언트 측 &에서 텍스트 길이를 쓰고 내용을 쓸 수 있습니다.