我正在练习Java并发,并使用聊天客户端/服务器进行学习。
目前,每个客户端都需要一对终端窗口(接收器和发送器)。所以真的有一组发送方客户端和一组接收方客户端,我只是成对考虑它们。
有没有一种简单的方法可以同时输入数据和接收控制台/终端数据?
如果它有所不同,我不需要回显输入,只需要服务器的输出。终端也是bash,所以也许有一个简单的终端解决方案?
答案 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
然后,您输入该控制台的每一行都将从服务器回显给您。
祝你的项目好运!