2

したがって、出力と入力がリダイレクトされて非表示になっているプロセス(Javaコマンドラインアプリケーション)があります。出力を非常に簡単に読み取ることができ、それは機能しますが、コマンドを送信すると機能しません。

次の理由により、入力がリダイレクトされていないと判断したと思います。

(A)コマンドを送信WriteLine(//command here); Flushしても、プログラムによって確認応答がありません

(B)cmdウィンドウを再表示すると(StartInfo.CreateNoWindow = false;)StandardInputがリダイレクトされている場合でも、コマンドを入力して(cmdウィンドウで)実行できます(StartInfo.RedirectStandardInput = true;

コードは次のとおりです。

namespace bukkit
{
    public partial class Form1 : Form
{
    private static StringBuilder _txt = new StringBuilder();
    private static bool _scrolled = false;
    Process mncrft = new Process();

    public Form1()
    {
        InitializeComponent();

        mncrft.StartInfo.WorkingDirectory = Path.GetTempPath();
        mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\mncrft.jar";
        mncrft.StartInfo.FileName = "java.exe";
        mncrft.StartInfo.UseShellExecute = false;
        mncrft.StartInfo.RedirectStandardOutput = true;
        mncrft.StartInfo.RedirectStandardError = true;
        mncrft.StartInfo.RedirectStandardInput = true;
        mncrft.StartInfo.CreateNoWindow = false;
        mncrft.ErrorDataReceived += build_ErrorDataReceived;
        //mncrft.OutputDataReceived += build_ErrorDataReceived;
        mncrft.EnableRaisingEvents = true;
        //mncrft.StandardInput.NewLine = "\r\n";
        mncrft.Start();
        mncrft.BeginOutputReadLine();
        mncrft.BeginErrorReadLine();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _txt.AppendLine("Starting Minecraft...");
    }

    private void Form1_Close(object sender, EventArgs e)
    {
        mncrft.Close();
    }

    static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        string msg = e.Data;
        if (msg != null && msg.Length > 0)
        {
            _txt.AppendLine(msg);
            _scrolled = false;
        }
    }

    private void mainTimer_Tick(object sender, EventArgs e)
    {
        if (_txt.Length > 0)
        {
            txtOutput.Text = _txt.ToString();

            // scroll down
            if (_scrolled == false)
            {
                txtOutput.SelectionStart = txtOutput.Text.Length;
                txtOutput.ScrollToCaret();
                _scrolled = true;
            }
        }
    }

    private void Execute_Click(object sender, EventArgs e)
    {
        if (textBox1.Text.Length > 0)
        {
            mncrft.StandardInput.WriteLine(textBox1.Text);
            mncrft.StandardInput.Flush();
        }
    }
}
}

コマンドを送信できるように入力をリダイレクトするにはどうすればよいですか?

ありがとう、アダム

PS:これが紛らわしい場合は、コメントを書いてください。喜んで明確にします。

答えた

ティムのおかげで、次の行を置き換えます。

mncrft.StartInfo.FileName = "java.exe";
mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\mncrft.jar";

と:

mncrft.StartInfo.FileName = "java";
mncrft.StartInfo.Arguments = "-Xmx512M -Xms512M -jar C:\\mncrft\\bukkit.jar -nojline";
4

3 に答える 3

5

わかりました、私はこれを一日中いじっていました、そして私は答えを見つけました。アプリケーションでbukkitを起動するときは、プロセスの引数に「-nojline」を含める必要があります。これにより、bukkitの入力が標準入力で正しく機能するようになります。

https://github.com/Bukkit/CraftBukkit/commit/22a44d47ac48fb65bb61fb823c84bff9494f5033

于 2011-07-12T20:29:12.137 に答える
0

アダム、私はあなたの質問に対する答えを確かに知りませんが、私は過去に同様の問題を抱えており、コンソールでのstdinとstdoutに関しては、winformアプリケーションの動作が少し異なることを学びました。AttachConsole(およびそれを解放するためのFreeConsole)へのAPI呼び出しを使用してオンラインでいくつかの投稿を読んだ後、問題を解決しました。多分それはあなたの問題の解決策として調査するための良い出発点になるでしょう。

[DllImport("kernel32.dll")]
static extern bool AttachConsole(int dwProcessId);
于 2011-05-08T14:07:33.510 に答える
0

これは非常に奇妙です。入力ストリームが(何らかの理由で)リダイレクトされなかった場合、Process.StandartInputプロパティを使用して何かを実行しようとすると例外が発生し、実際にリダイレクトされた場合はリダイレクトされないためです。 cmdウィンドウにコマンドを入力して実行することができます!

問題がWinFormsアプリケーションを作成していることが原因である場合(Fadrianが述べたように)、それをWPFアプリケーションにしてみてください(私は個人的にWinFormsよりもWPFを好みます)。これまでにWPFアプリをコーディングしたことがない場合は、ブログでリンクしたコードをダウンロードしてください。ここに投稿して(はい、以前にアクセスしたもの)、通常のMinecraftサーバーの代わりにBukkitサーバーをロードするように変更します。機能しなかった場合は、Bukkitサーバーに問題がある可能性があります。その時点で、次のことをお勧めします。 Bukkitのフォーラムにアクセスして、そこで質問します。

于 2011-05-12T00:28:18.227 に答える