大约一小时后运行较慢的Java异步客户端

时间:2017-03-14 10:34:41

标签: java sockets asynchronous

我尝试连接异步套接字并每秒读取一次新消息。

我使用了示例客户端代码(http://www.java2s.com/Tutorials/Java/Java_Network/0080__Java_Network_Asynchronous_Socket_Channels.htm),并在getTextFromUser方法中添加了sleep方法(1000毫秒)并从用户中删除了读取命令。

此外,我在ReadWriteHandler方法中添加了其他逻辑。它开始工作很好,但是大约一个小时之后程序被暂停并且已经工作(执行我的附加逻辑)不是每秒一次,而是每10分钟一次。

你知道会发生什么吗?

部分代码:

public void ConnectAsynchr() {


 try {   


     this.channel = AsynchronousSocketChannel.open();
    SocketAddress serverAddr = new InetSocketAddress("localhost", PortNumberAsynchr);
    Future<Void> result = channel.connect(serverAddr);

    try {
        result.get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



    this.writeLog("ConnAsynch", "Asynchronous connection succesful established", true);

    this.connectAsynch = true;
    this.attach = new Attachment();
    this.attach.channel = this.channel;
    this.attach.buffer = ByteBuffer.allocate(16384);
    this.attach.isRead = false;
    this.attach.mainThread = Thread.currentThread();


    ReadWriteHandler readWriteHandler = new ReadWriteHandler();
    this.channel.write(this.attach.buffer, this.attach, readWriteHandler);

    try {
        this.attach.mainThread.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        this.writeLog("ERROR", e.toString(), false);
        e.printStackTrace();
    }


 }
 catch (IOException e) {
     this.writeLog("ERROR", e.toString(), false);
     System.out.println(e);

 }

}



class Attachment {
  AsynchronousSocketChannel channel;
  ByteBuffer buffer;
  Thread mainThread;
  boolean isRead;
}
class ReadWriteHandler implements CompletionHandler<Integer, Attachment> {
  @Override
  public void completed(Integer result, Attachment attach) {
    if (attach.isRead) {
      attach.buffer.flip();
      Charset cs = Charset.forName("UTF-8");
      int limits = attach.buffer.limit();
      byte bytes[] = new byte[limits];
      attach.buffer.get(bytes, 0, limits);
      String msg = new String(bytes, cs);


      writeLog("Asynchr Msg rec", msg, false);



      AsynchrMessLogic(msg);



      try {
        msg = this.getTextFromUser();
      } catch (Exception e) {
        e.printStackTrace();
      }
      if (msg.equalsIgnoreCase("bye")) {
        attach.mainThread.interrupt();
        return;
      }

       attach.buffer.clear();
      byte[] data = msg.getBytes(cs);
      attach.buffer.put(data);
      attach.buffer.flip();
      attach.isRead = false; // It is a write
      attach.channel.write(attach.buffer, attach, this);
    }else {
      attach.isRead = true;
      attach.buffer.clear();
      attach.channel.read(attach.buffer, attach, this);
    }
  }
  @Override
  public void failed(Throwable e, Attachment attach) {
    e.printStackTrace();
  }
  private String getTextFromUser() throws Exception{
    /*System.out.print("\nPlease enter a  message  (Bye  to quit):");
    BufferedReader consoleReader = new BufferedReader(
        new InputStreamReader(System.in));
    String msg = consoleReader.readLine();
    */
    Thread.sleep(threadSleep);
    String msg="aaa";
    return msg;
  }
}

0 个答案:

没有答案