我正在练习Java并发性,并使用聊天客户端/服务器进行学习。
目前,我需要一对终端窗口(一个接收者和一个发送者)每个客户端。所以实际上有一组发送方客户端和一组接收方客户端,我只是将它们成对考虑。
有没有一种简单的方法可以同时输入数据和接收控制台/终端数据?
如果有区别,我不需要回显输入,只需要服务器的输出。另外,终端是bash,所以也许有一个简单的终端解决方案?
发布于 2011-03-13 07:34:15
原则上应该不存在同时写入和读取同一终端的问题--只需使用不同的线程进行输入和输出即可。但是,当输入位于输出之间时,您的输出可能看起来有点混乱。
为了避免这种情况,并拥有某种窗口终端,您需要对终端进行更详细的说明,这在不同的系统上是不同的,并且可能需要JNI (或某个JNI包装库)。
发布于 2011-03-13 05:08:31
控制台(即标准输入和输出流)由操作系统在启动时提供给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然后,您在该控制台中键入的每一行都将从服务器回显给您。
祝你的项目好运!
https://stackoverflow.com/questions/5284991
复制相似问题