0

サーバー用のクライアントを作成していますが、行き詰まっています。サーバーが Unicode テキストを送信しており、クライアントがそれを受信して​​います。問題は次のコードです。

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

FTPCommandsサーバーから送信された番号でEnum からテキストを取得しようとしています。まず、クライアントが ID を受け取ります: 1 732847823(デバッガーからの結果)。

この場合、正しく分割されます: replace[0].ToString()-->"1" AND replace[1].ToString()-->"732847823"

エラーは発生しません!

2 番目のコマンドで、クライアントはサーバーからエラーを受け取ります。

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()-->"再び" AND replace[4].ToString()-->"レイター"

そして今、エラーが発生します!これが最初のコマンドで機能し、コマンドでは機能しない理由がわかりません8replace[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

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

nullの代わりにintを割り当てるか、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 に答える