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