BufferedWriter不接受来自客户端的第二个输入?

时间:2015-11-11 22:17:20

标签: java sockets

我有一个服务器和客户端应用程序。它们都使用BufferedWriter-InputStreamReader-InputStream来读取来自服务器或来自客户端的信息

我有工作所以我可以使用

bw.write("command");

在服务器端执行命令,并将信息输出回客户端。

然而,对于两个不同的命令,我遇到了两次麻烦。这是代码:

服务器端代码:

public void run() {
        try {
            while (true) {
                socket.setTcpNoDelay(true);
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String input = br.readLine();

                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                if (input.equals("increment")) {
                    bw.write(String.valueOf(totalBets.incrementAndGet()));
                    bw.newLine();
                    bw.flush();
                } else if(input.equals("generate")) {
                    Random rand = new Random();
                    bw.write(String.valueOf(rand.nextDouble()*99));
                    bw.newLine();
                    bw.flush();
                }
            }
}

客户端代码:

public void actionPerformed(ActionEvent arg0) {
            try {
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);

                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);

                bw.write("increment" + "\n");
                bw.flush();

                String id = br.readLine();

                bw.write("generate");
                bw.flush();

                String roll = br.readLine();
            }
}

第一个字符串id获取运行bw.write("increment")的输出,但是当我尝试运行bw.write("generate")时,它会在运行该行时冻结:String roll = br.readLine();

任何帮助?

谢谢!

2 个答案:

答案 0 :(得分:0)

我建议您使用PrintWriter而不是BufferedWriter。使用BufferedReader进行读取而不会在底层操作系统的缓冲区中保留数据,因此它们将在应用程序级别进行缓冲,但是对于写入,您希望它在发送一个完整的&#39后立即进行读取;命令&#39 ;.

使用PrintWriter,您还可以使用println来解决您的问题。

答案 1 :(得分:-1)

通过创建多个BufferedReaders,您将丢失数据或冒险。在插座的使用寿命中使用相同的一个。同上BufferedWriter。