Java套接字BufferedReader立即读取循环中的所有输入

时间:2015-05-14 21:26:51

标签: java swing sockets client server

我有简单的服务器 - 客户端应用程序。有一个选项,客户端可以发送到服务器,以读取生成的数据。

void getManyFromServer(int numberOfGets){
    try{
            for(int i=0;i<numberOfGets;i++){

                    fromServer = sockIn.readLine();
                    fromServer+="\n";
                    textArea.append(fromServer);
            }
        } catch(IOException exc){
            /*...*/
    }
}

正如您所看到的,我想要读取数据10次,因为服务器将每3秒生成10个不同的数字:

Random randomGenerator = new Random();
        double MEAN = 4.0f; 
        double VARIANCE = 0.01f;

    for(int i=0;i<10;i++){
        out.println(Double.toString(MEAN + randomGenerator.nextGaussian()* VARIANCE));
        try{
            Thread.sleep(3000);
        } catch(InterruptedException e){
            /*...*/
        }

问题是 - 客户等到所有&#34; out.println&#34;完成,然后在textArea中一次打印所有内容。

如何在将数据写入textArea之间模拟3s延迟?

1 个答案:

答案 0 :(得分:4)

从客户端打印出println,您可能会发现它并未同时读取所有内容。相反,您可能通过在Swing事件线程上执行此读取来冻结GUI,从而阻止它将文本写入文本组件。解决方案:使用后台线程(如SwingWorker)进行读取。有关详细信息,请阅读Lesson: Concurrency in Swing

如,

private void getManyFromServer2(final int numberOfGets) {
  new SwingWorker<Void, String>() {
     @Override
     protected Void doInBackground() throws Exception {
        try {
           for (int i = 0; i < numberOfGets; i++) {

              fromServer = sockIn.readLine();
              fromServer += "\n";
              // textArea.append(fromServer);
              publish(fromServer);
           }
        } catch (IOException exc) {
           exc.printStackTrace();
        }
        return null;
     }

     @Override
     protected void process(List<String> chunks) {
        for (String line : chunks) {
           textArea.append(line);
        }
     }

     @Override
     protected void done() {
        try {
           get();
        } catch (InterruptedException | ExecutionException e) {
           e.printStackTrace();
        }
     }
  }.execute();
}