代码之家  ›  专栏  ›  技术社区  ›  Yury Kerbitskov

客户端-服务器应用程序在尝试从服务器C获取响应时不执行任何操作#/

  •  0
  • Yury Kerbitskov  · 技术社区  · 11 年前

    我正在编写客户端-服务器应用程序。客户端发送命令,服务器接收命令并执行一些操作。它工作得很好。但当我试图从服务器向客户端发送响应并在客户端接收时,什么都没有发生。甚至服务器也不做任何事情。程序挂起,只有Shift+F5帮助完成。

    服务器代码:

    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 回复  |  直到 11 年前
        1
  •  1
  •   dvasanth    11 年前

    在服务器端,读取循环被永远阻塞。您只需要阅读文本的长度&然后解析请求。您可以从客户端&然后写下内容。