//问题出在这里:加了这部分代码才能收完数据包
if (r == 12){
try{
//Logs是自己写的一个输出到文本框的输出类
Logs.println("12");
}
catch(Exception ex){ }
}//以上是问题所在的代码
你这段代码没有对Channel处理吧

解决方案 »

  1.   

    to shangqiao(伤桥):为什么要对Channel做处理呢?我读数据时,长度为12位的话,就会做一个延时的操作,然后再次读数据。如果没有延时的操作,再次读数据就会为空。
      

  2.   

    private static void channelCopy1 (ReadableByteChannel src,
    WritableByteChannel dest)
    throws IOException
    {
    ByteBuffer buffer = ByteBuffer.allocateDirect (16 * 1024);
    while (src.read (buffer) != -1) {
    // Prepare the buffer to be drained
    buffer.flip();
    // Write to the channel; may block
    dest.write (buffer);
    // If partial transfer, shift remainder down
    // If buffer is empty, same as doing clear()
    buffer.compact();
    }
    // EOF will leave buffer in fill state
    buffer.flip();
    // Make sure that the buffer is fully drained
    while (buffer.hasRemaining()) {
    dest.write (buffer);
    }
    }
      

  3.   

    /**
    * Channel copy method 1. This method copies data from the src
    * channel and writes it to the dest channel until EOF on src.
    * This implementation makes use of compact() on the temp buffer
    * to pack down the data if the buffer wasn't fully drained. This
    * may result in data copying, but minimizes system calls. It also
    * requires a cleanup loop to make sure all the data gets sent.
    */
      

  4.   

    /**
    * Channel copy method 2. This method performs the same copy, but
    * assures the temp buffer is empty before reading more data. This
    * never requires data copying but may result in more systems calls.
    * No post-loop cleanup is needed because the buffer will be empty
    * when the loop is exited.
    */
    68
    private static void channelCopy2 (ReadableByteChannel src,
    WritableByteChannel dest)
    throws IOException
    {
    ByteBuffer buffer = ByteBuffer.allocateDirect (16 * 1024);
    while (src.read (buffer) != -1) {
    // Prepare the buffer to be drained
    buffer.flip();
    // Make sure that the buffer was fully drained
    while (buffer.hasRemaining()) {
    dest.write (buffer);
    }
    // Make the buffer empty, ready for filling
    buffer.clear();
    }
    }