Java控制台/读写并发

时间:2011-03-12 19:46:08

标签: java linux bash

我正在练习Java并发,并使用聊天客户端/服务器进行学习。

目前,每个客户端都需要一对终端窗口(接收器和发送器)。所以真的有一组发送方客户端和一组接收方客户端,我只是成对考虑它们。

有没有一种简单的方法可以同时输入数据和接收控制台/终端数据?

如果它有所不同,我不需要回显输入,只需要服务器的输出。终端也是bash,所以也许有一个简单的终端解决方案?

2 个答案:

答案 0 :(得分:1)

原则上,同时写入和读取同一个终端应该没有问题 - 只需使用不同的线程进行输入和输出。但是,当输入介于它之间时,您的输出可能看起来有点受损。

为了避免这种情况,并且有一个窗口终端,你需要更详细地说明你的终端,这在不同的系统上是不同的,并且可能需要JNI(或一些JNI包装库)。

答案 1 :(得分:0)

控制台(即标准输入和输出流)由操作系统在启动时提供给java进程。我知道没有可以提供多个控制台的操作系统。

因此,我建议您将客户端和服务器作为单独的Java进程启动,并让它们通过TCP进行通信。根据您的目标,您可以实现现有的通信协议,如Telnet或IRC,这将允许您使用这些协议的现有客户端应用程序,并提供所有这些功能,但可能会给您带来比您更多的命令的负担可能需要,或定义自己的简单协议,在这种情况下,您还必须实现客户端。

关于后者的一种方法是做类似的事情:

public class Client {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket(args[0], Integer.parseInt(args[1]));
        new Repeater(System.in, s.getOutputStream()).start();
        new Repeater(s.getInputStream(), System.out).start();
    }
}


public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
        for (;;) {
            Socket s = ss.accept();
            // simply echo for now. You can do more interesting things here ...
            new Repeater(s.getInputStream(), s.getOutputStream()).start();
        }
    }
}



class Repeater extends Thread {
    final InputStream in;
    final OutputStream out;

    public Repeater(InputStream in, OutputStream out) {
        this.in = in;
        this.out = out;
    }

    @Override public void run() {
        try {
            byte[] buf = new byte[4096];
            int r;
            while ((r = in.read(buf)) != -1) {
                out.write(buf, 0, r);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

然后你可以这样做:

java Server 55555

并在另一个控制台

java Client localhost 55555

然后,您输入该控制台的每一行都将从服务器回显给您。

祝你的项目好运!

相关问题