2013-11-23 3 views
0

могли бы вы взглянуть на мой код:java.nio.SocketChannel всегда возвращаются одни и те же данные

private void initSocket() { 
     try { 
      socketChannel = SocketChannel.open(); 
      socketChannel.configureBlocking(false); 
      socketChannel.bind(null); 
      socketChannel.connect(new InetSocketAddress(host,port)); 
      while(! socketChannel.finishConnect()){ 
       Thread.sleep(5); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    private void initOutput() { 
     outBuffer = ByteBuffer.allocateDirect(512);  //Allocate direct for better performance (no java-heap alloc) 
     outBuffer.clear(); 
    } 

    private void initInput() { 
     inBuffer = ByteBuffer.allocateDirect(1024);  //Allocate direct for better performance (no java-heap alloc) 
     inBuffer.clear(); 
    } 

    public String in() { 
     try { 
      while (socketChannel.re) 
      socketChannel.read(inBuffer); 
      inBuffer.mark(); 
      final String ret = Charset.forName("UTF-8").newDecoder().decode(inBuffer).toString(); 

      bulletin.PIPE_IN.Info.push(" <<< ", new String[]{"TsPipe2","in"}, new Object[]{ret, inBuffer}); 

      return ret; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public void out (String out) { 
     outBuffer.clear(); 
     outBuffer.put(out.getBytes()); 

     //Write all in one go 

     bulletin.PIPE_OUT.Info.push(" >>> ", new String[]{"TsPipe2","out"}, new Object[]{outBuffer, out}); 

     int toWrite = outBuffer.remaining(); 

     for (int i = 0; i < toWrite; ++i) { 
      try { 
       i += socketChannel.write(outBuffer); 
       Thread.sleep(Period.NIO_CHANNEL_WRITE_SLEEP.getValue()); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

И скажите мне, что я делаю неправильно?

В теме состояний Я всегда получать те же данные из метода, и я не уверен, что кастрированный баран мой вне метод работает или не

я путешествовал повсеместно в несколько учебников сейчас, и это может быть я перепутал что-то , Я также нашел многообещающий материал в stackoverflow, но ничего не работал.

В качестве небольшой информации о фоновом режиме - я пишу командную команду Teamspeak через Sockets с TS-сервером и ушел довольно далеко. С того момента, как я впервые услышал о nio, я хотел перейти на него.

Рассматриваются ли их другие рамки? слышал, что Google Grizzly довольно опрятный, но не уверен, полезен ли он для моего случая?

+0

Где вы очищаете буфер? Я предлагаю вам изменить свой код, чтобы обрабатывать частичные чтения и несколько сообщений одновременно. TCP - это протокол потока, а не протокол обмена сообщениями. –

ответ

1

Я считаю, что вам не хватает скобок в этом цикле while (socketChannel.re).

Смежные вопросы