切换语句字符串匹配但不起作用

时间:2019-01-28 12:44:57

标签: c# arrays string tcp switch-statement

我有一个switch语句,该语句使用从char []转换而来的字符串,该字符串是通过数据流从服务器发送到客户端的。该代码是客户端的。

即使服务器和默认错误代码始终与大小写完全匹配,也始终会击中默认情况。

SERVER SIDE
private void SendToClient(string message, TcpAccount account)
    {
        try
        {
            byte[] buffMessage = Encoding.ASCII.GetBytes(message);
            account.TcpClient.GetStream().WriteAsync(buffMessage, 0, buffMessage.Length);
            log.AppendText(string.Format("Message {0} sent to account {1}", message, account.ID));
            log.AppendText(Environment.NewLine);
        }
        catch
        {
            log.AppendText(string.Format("Message {0} sent to account {1}", message, account.ID));
            log.AppendText(Environment.NewLine);
        }
    }

CLIENT SIDE
public async void ReadDataAsync(TcpClient client)
    {
        try
        {
            StreamReader clientStreamReader = new StreamReader(client.GetStream());
            char[] buff = new char[64];
            int readByteCount = 0;

            while (true)
            {
                readByteCount = await clientStreamReader.ReadAsync(buff, 0, buff.Length);

                if (readByteCount <= 0)
                {
                    Console.WriteLine("Disconnected from server.");
                    client.Close();
                    break;
                }
                string code = new string(buff);
                ProcessServerCode(code);
                Array.Clear(buff, 0, buff.Length);
            }
        }
        catch
        {

        }
    }

public void ProcessServerCode(string code)
    {
        switch (code)
        {
            case "regcom":
                MessageBox.Show("Registration Complete");
                break;

            case "logcom":
                MessageBox.Show("Login Complete");
                break;

            case "badpass":
                MessageBox.Show("Invalid Password");
                break;

            case "badaccount":
                MessageBox.Show("Invalid Account");
                break;

            default:
                MessageBox.Show("Unknown Code: " + code);
                break;
        }
    }

我无法取消默认代码。

此外,由于我是客户机/服务器和套接字编程的新手,所以我刚刚意识到服务器发送了一个byte [],但是客户机却接收到char []。那里有冲突吗?有任何特殊原因(因为我正在使用在线培训课程中的特定代码段)?

1 个答案:

答案 0 :(得分:5)

我看到的第一个问题是您忽略了readByteCount(实际上是一个字符数,而不是字节数);您应该使用:

string code = new string(buff, 0, readByteCount);

但是,我看到的下一个问题是您没有任何框架协议。这意味着:

  • 如果两条消息并发发送,您可能会收到似乎是单个连接值的
  • 即使单个值在数据包之间分割也可以被任意截断

无论哪种情况:

  • 如果消息长于缓冲区长度,则说明您已损坏
  • 如果您一次一次收到多封邮件,则表示您已损坏

无论哪种情况,都永远无法正确恢复位置。因此:框架,其中每个框架都是完整的消息。

基于文本的协议的常用方法是使用换行符作为框架(我将决定是否表示CR,LF,CRLF等);那么您只需在文本阅读器上使用ReadLine / ReadLineAsync,它就会自动完成所有操作,因此:

string code = await clientStreamReader.ReadLineAsync();
if (code is null)
{
    Console.WriteLine("Disconnected from server.");
    client.Close();
}
else
{
    ProcessServerCode(code);
}