0

Java でコーディングされたサーバーに、コンソールを追加したいと考えています。ソケットを使用してサーバーに接続します。コンソール用に作成したコードは次のとおりです。

私のサーバー上:

public class ServerConsole
{   
    public String exec(String[] cmd)
    {
        try
        {
            Process child = Runtime.getRuntime().exec(cmd);

            InputStream in = child.getInputStream();
            StringBuffer buffer = new StringBuffer();
            int c;
            while ((c = in.read()) != -1)
            {
                buffer.append((char)c);
            }
            in.close();

            return buffer.toString();
        }
        catch (Exception e) {}

        return "FAILED";
    }
}

このクラスは、指定されたコマンドを実行し、実行後のコンソールの内容を含む文字列を返します。

このメソッドを次のように呼び出します。

String cmd_data_cmd = inputStream.readUTF();
String[] dataCmd = cmd_data_cmd.split("#");
OSCmd osCmd = new OSCmd();
outputStream.writeUTF(osCmd.exec(dataCmd));

inputStream は、ソケットで使用するストリームです。それはうまくいきます!

さて、クライアント側では、次のようにしました。

String[] cmd = cmd_input.getText().split(" ");
String new_cmd = "";
for (String part : cmd)
    new_cmd += (new_cmd.equals("") ? "": "#") + part;

this.outputSocket.writeUTF(new_cmd);
DataInputStream result_input = new DataInputStream(this.input);
String tmp = result_input.readUTF();
System.out.println(tmp);

これにより、コンソールに表示される結果が返されるはずですが、実際には何も起こりません。コードのその部分を開始するとフリーズします。

それを行う方法はありますか?

ありがとう。

4

1 に答える 1

0

解決策は次のとおりです。

String[] cmd_exec = {};
String os_name = System.getProperty("os.name").toLowerCase();
if (os_name.indexOf("win") >= 0)
    cmd_exec = new String[]{"cmd.exe", "/c", cmd};
else if (os_name.indexOf("mac") >= 0)
    cmd_exec = new String[]{"/usr/bin/open", "-a", cmd};
else if (os_name.indexOf("nix") >= 0 || os_name.indexOf("nux") >= 0)
    cmd_exec = new String[]{"/bin/bash", cmd};
else if (os_name.indexOf("sunos") >= 0)
    cmd_exec = new String[]{"/bin/bash", cmd};

Process child = Runtime.getRuntime().exec(cmd_exec);

String line;
while ((line = stdInput.readLine()) != null)
{
    buffer.append("\t" + new String(line.getBytes("UTF-8"), "UTF-8") + "\n");
}
stdInput.close();
while ((line = stdError.readLine()) != null)
{
    buffer.append("\t" + new String(line.getBytes("UTF-8"), "UTF-8") + "\n");
}
stdError.close();

child.destroy();

これが他の誰かを助けることを願っています。

于 2012-04-20T13:06:07.200 に答える