Java ChatServer - 可选前缀

时间:2017-10-04 07:09:57

标签: java

我正在用java编写一个基本的聊天服务器,但是我遇到了一些问题。当有人创建客户端或服务器时,我希望他们能够输入命令行参数,该参数用作他们发送的任何消息的前缀。这个论点也应该是可选的。我有一定程度的工作,由于某种原因,当我发送消息它发送前缀两次,也不是可选的。任何帮助表示赞赏,干杯!

public class ReadWriteThread extends Thread {

    private BufferedReader input;
    private PrintWriter output;
    private String prefix;

    public ReadWriteThread(InputStream input, OutputStream output, String prefix) {
        this.input = new BufferedReader(new InputStreamReader(input));
        this.output = new PrintWriter(output, true);
        this.prefix = prefix;
    }

    public void run() {
        try {
            String line;
            while ((line = input.readLine()) != null) {
                output.println(prefix + " " + line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class Server {

    public static void main(String[] args) {
        try {
            int port = Integer.parseInt(args[0]);
            System.out.println("HELLO " + args[1]);
            String prefix = args[1];
            ServerSocket serverSocket = new ServerSocket(port);
            System.err.println("Waiting for a client to connnect");
            Socket socket = serverSocket.accept();
            System.err.println("Accepted connection on port " + port);
            new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start();
            new ReadWriteThread(socket.getInputStream(), System.out, prefix).start();
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("\nUsage: java Server <port>");
        }

    }

}
public class Client {

    public static void main(String[] args) {
        Socket socket = null;
        try {
            int port = Integer.parseInt(args[0]);
            String prefix = args[2];
            socket = new Socket(args[1], port);
            System.err.println("Connected to " + args[1] + " on port " + port);
            new ReadWriteThread(System.in, socket.getOutputStream(), prefix).start();
            new ReadWriteThread(socket.getInputStream(), System.out, prefix).start();
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("\nUsage: java Client <port>");
        }
    }
}

输入

启动服务器
java Server 7777 OPTIONALPREFIX

输入

启动客户端
java Client 7777 localhost

服务器上的当前输出

Waiting for a client to connnect
Accepted connection on port 7777
-->-->hello
-->-->whats up

1 个答案:

答案 0 :(得分:1)

客户端和服务器都在其邮件前加前缀,您可能已将-->设置为两者的前缀。

所以客户端可能会发送

--> hello

然后服务器接收它并在将其登录到控制台之前预先设置自己的前缀

--> --> hello

为什么前缀不是可选的?因为你总是试图阅读它,所以你永远不会检查传递给程序的参数数量。

String prefix = args[1];

要访问args[1],首先需要检查args是否包含两个参数。