0

我正在为我的服务器创建一个客户端,但我被卡住了。我的服务器正在发送 Unicode 文本,我的客户端收到了它。问题是这段代码:

Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim()))

我正在尝试FTPCommands使用服务器发送给我的号码从我的枚举中获取文本。首先,我的客户正在接收 ID:(1 732847823来自调试器的结果)。

它正确拆分,在这种情况下: replace[0].ToString()-->"1" AND replace[1].ToString()-->"732847823"

没有错误发生!

在第二个命令中,客户端从服务器收到错误:

8 Server is too full, try again laiter

它也正确分裂,在这种情况下:

replace[0].ToString()-->"1" AND replace[0].ToString()-->"8" AND replace[1].ToString()-->"Server" AND replace[2].ToString()-->"is" AND replace[3].ToString()-->"too" AND replace[4].ToString()-->"full," AND replace[4].ToString()-->"try" AND replace[4].ToString()-->“再次”和 replace[4].ToString()-->“莱特”

现在错误发生了!我不知道为什么这适用于第一个命令而不是命令8。如果我用replace[0].Trim()数字 8 替换它,它工作正常。代码有什么问题,或者什么可能导致该错误?是因为我使用的是 Unicode 吗?

以下是我的一些代码示例:

NetworkStream stream = client.GetStream();
                StreamWriter sw = new StreamWriter(stream, Encoding.Unicode);
                StreamReader sr = new StreamReader(stream);
                //SendFileToServer(@"\\fs1\home\manuel.boehmler\contacts.rar", client);
                AnswerToServer(FTPCommands.ID,null,sw);
                AnswerToServer(FTPCommands.Username, txtBUserName.Text, sw);
                AnswerToServer(FTPCommands.Password, txtBPassword.Text, sw);
                AnswerToServer(FTPCommands.login,null, sw);
                AnswerToServer(FTPCommands.MaxMbytes, txtBPassword.Text, sw);

                //AnswerToServer(FTPCommands.FileTransfer,"", sw);


                string line = null;
                while (client.Connected == true)
                {
                    if (!string.IsNullOrEmpty(line = sr.ReadLine()) && line.Length >= 2)
                    {

                        RichTxtMessage("Bekommt: " + line, true);
                        string[] replace = null;
                        string command = "";

    replace = line.Split(' ');
    command = replace[0].ToUpperInvariant();

    string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : null;

    switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim())).ToUpperInvariant()) //Error occurs here
    {
        case "ID":
          RichTxtMessage(arguments,true);
          break;
        case "ERROR":
          RichTxtMessage(arguments, true);
          break;
    }
}

public enum FTPCommands
{

    Persmission = 0,
    ID = 1,
    Username = 2,
    Password = 3,
    UserNameReq = 4,
    PasswordReq = 5,

    Chat = 6,
    MessageRecived = 7,
    Error = 8,
    Warning = 9
}

编辑(更新):

当我使用 UTF8 作为编码时,控制台会给我这个结果: CMD, UTF8 流写入器

如您所见,有线符号是第一个字符。但是,当我使用 UNICODE(但仍然无法正常工作)时,它不会向我显示符号。我解决了这个问题,我的 FTP 服务器没有使用任何编码

4

2 回答 2

1

我不确定您为什么要费心将整数转换为字符串。您可以只转换为枚举并使用仅枚举值的开关,例如

int id = -1;
if (int.TryParse (replace[0].Trim (), id))
{
    switch ((FTPCommands)id)
    {
        case FTPCommands.ID:
            RichTxtMessage(arguments,true);
            break;
        case FTPCommands.Error:   
            RichTxtMessage(arguments, true);
            break;
    }
}
于 2014-04-25T12:00:48.020 回答
1

而不是 Convert.ToInt32(replace[0].Trim())) 使用 int.TryParse:

int i = 0;
int.TryParse(replace[0].Trim(), out i)

编辑:如果 null 在元素中,则该元素不能转换为 int 并且会抛出错误

string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : null;

switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(replace[0].Trim())).ToUpperInvariant()) //Error occurs here

分配一些 int 而不是 null,或者在转换为 int 之前检查它不为 null 或为空

  string arguments = replace.Length > 1 ? line.Substring(replace[0].Length + 1) : "-1";

// OR do this
int opt = 0;
if (!string.IsNullOrEmpty(replace[0].Trim())
opt = int.TryParse(replace[0].Trim(), out opt);
switch (Enum.GetName(typeof(FTPCommands), Convert.ToInt32(opt)).ToUpperInvariant())       //Error occurs here
于 2014-04-25T11:34:57.720 回答