繁体   English   中英

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

[英]Client-Server application do nothing when trying to get response from server C#/

我正在编写客户端服务器应用程序。 客户端发送命令,服务器接收该命令并进行一些操作。 它运作良好。 但是,当我尝试将响应从服务器发送到客户端并在客户端接收时,什么也没有发生。 甚至服务器什么也不做。 程序挂起,只有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);
}

显示服务器端的所有消息,然后我不尝试在客户端获得响应。 当我尝试获取响应时,未显示任何消息,但已建立连接。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM