通过Java中的标准输入/输出进行通信

时间:2012-02-15 16:17:05

标签: java io jvm pipe

我正在尝试在两个JVM之间发送消息:服务器启动第二个进程。然后,第二个过程是向服务器发送消息,该消息将消息打印到控制台。代码如下:

public class Server
{
    public static void main(String[] args)
    {
        Process client=null;
        BufferedReader clientInput=null;

        try
        {
            client=Runtime.getRuntime().exec("java Client");
            clientInput=new BufferedReader(new InputStreamReader(client.getInputStream()));
        }
        catch(IOException e){}

        System.out.println("Waiting for the client to connect...");

        try
        {
            String msg=clientInput.readLine();
            System.out.println(msg);
        }
        catch(IOException e){}

        client.destroy();
    }
}

public class Client 
{
    public static void main(String[] args) 
    {   
        BufferedWriter out = new BufferedWriter( new OutputStreamWriter(System.out));

        try 
        {
            out.write("Ready\n");
            out.flush();
        } 
        catch (Exception e){}
    }
}

如果我运行它,我从服务器获取输出null。最后,沟通应该是双向的。非常感谢任何帮助。

编辑:我没有收到任何错误(只是从catch块中删除了print语句以节省空间)。

2 个答案:

答案 0 :(得分:1)

您在流的末尾收到null。客户端正确启动,发送就绪,结束,因此流结束。

完全正确的行为。如果客户端自己结束(但是做了其他事情,比如在stdin上读取服务器消息),服务器永远不会收到空值。

编辑:永远不要(!!!!!)这样做:

catch(IOException e){}

至少写:

catch(IOException e){ e.printStackTrace() }

这会显示您的错误!

在我的公司,这是代码风格的基本规则之一!

答案 1 :(得分:1)

我认为你需要添加一个while循环:

while ((s = in.readLine()) != null && s.length() != 0)
    System.out.println(s);
}