客户机-服务器应用程序在尝试从服务器c# /获取响应时什么也不做

本文关键字:服务器 响应 什么 获取 应用程序 客户机 | 更新日期: 2023-09-27 18:14:13

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

服务器端的所有消息都显示,然后我没有试图在客户端得到响应。当我试图得到响应没有消息显示,但连接已建立。

客户机-服务器应用程序在尝试从服务器c# /获取响应时什么也不做

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

相关文章: