2014-09-26 2 views
-1

Я работаю над простым приложением. Я пытаюсь понять мое исключение, но я просто не могу.Не удается подключиться к Netty Server дважды

Как воспроизвести:

  1. Запуск Нетти
  2. лицо, вручающее судебные документы
  3. Подключение к Нетти сервера с клиентом -> Действительно Response, Server + Client работает нормально.
  4. Client закрыт (0 каналов активны, проверенные с помощью отладки нити)
  5. Нового клиента пытается прочитать -> Ошибка: java.net.SocketException: Программное обеспечение вызвало подключение прерывания: RECV не удалось
  6. Перезапуска сервера, Гото- .

источник Сервер:

public class Server { 

private final int port; 

public Server(int port) { 
    this.port = port; 
} 

public void run() throws Exception { 
    final EventLoopGroup boss = new NioEventLoopGroup(); 
    final EventLoopGroup worker = new NioEventLoopGroup(); 
    try { 
     final ServerBootstrap b = new ServerBootstrap(); 
     b.group(boss, worker) 
       .channel(NioServerSocketChannel.class) 
       .childHandler(new SocketChannelInitializer()); 

     final ChannelFuture f = b.bind(port).sync(); 
     final ChannelFuture c = f.channel().closeFuture(); 
     System.out.println("- DONE -"); 

     c.sync(); 
    } finally { 
     worker.shutdownGracefully(); 
     boss.shutdownGracefully(); 
    } 
} 

public static void main(String[] args) throws Exception { 
    int port; 
    if (args.length > 0) { 
     port = Integer.parseInt(args[0]); 
    } else { 
     port = 8080; 
    } 
    new Server(port).run(); 
} 

}

Мои Initialisizer:

public static final String PACKET = "packet"; 
public static final String STRING_DECODER = "stringDecoder"; 
public static final String NETWORK_HANDLER = "networkHandler"; 

@Override 
public void initChannel(SocketChannel ch) throws Exception { 
    System.out.println("Creating new Channel!"); 
    final ChannelPipeline p = ch.pipeline(); 
    p.addLast(NETWORK_HANDLER, new NetworkHandler()); 
    p.addLast(STRING_DECODER, new StringDecoder(CharsetUtil.UTF_8)); 
    p.addLast(new Testdecoder()); 
    p.addLast(new ChatAdapter()); 
} 

Сервер обрабатывает запрос, но не может прочитать правильное сообщение.

Мой Клиент:

public static void main(String[] args) throws IOException { 
    final Socket s = new Socket(); 
    s.connect(new InetSocketAddress("localhost", 8080)); 
    final InputStream is = s.getInputStream(); 
    final OutputStream os = s.getOutputStream(); 
    os.write(0x0); 
    os.write("username".getBytes(CharsetUtil.UTF_8)); 
    os.flush(); 
    System.out.println("!"); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

    byte[] b = new byte[4096]; 
    while (true) { 
     int n = is.read(b); 
     if (n < 0) { 
      break; 
     } 
     baos.write(b, 0, n); 
    } 

    byte data[] = baos.toByteArray(); 
    System.out.println(new String(data, CharsetUtil.UTF_8)); 
    System.out.println("- DONE -"); 
    s.close(); 
} 

Использование Netty 4.0.23.Final

Пример применения: https://github.com/BjoernAkAManf/Chat

Запуск Server.main (String [] арг) и запустить Client.main (String [] args) дважды. Сначала вы получите правильный результат. 2-й прогон завершится неудачно. Я тестировал все, что мог подумать. Очень ценю помощь здесь. Спасибо

+0

Downvoting без комментариев. Это очень приятно. Я пытаюсь самостоятельно отлаживать всю программу, работая довольно долго в течение нескольких дней - я не хочу никого обижать, но если вы занимете вопрос, по крайней мере, скажите мне причины - эту проблему легко воспроизвести, просто проверьте ее самостоятельно , Если проблема будет каким-то образом связана с моими обработчиками, исключение будет выброшено или напечатано где-нибудь. В моей логике должен быть недостаток - никто никогда не сообщал об этой проблеме раньше, и я использую здесь конюшни. – manf

ответ

0

Несмотря на мою первую идею, это не «реальная» проблема с сервером, и это не проблема с нетти. Клиент использует сокеты oio (java.IO) для подключения к серверу Nio Netty.

Изменение NioEventLoopGroup до OioEventLoopGroup и NioServerSocketChannel для OioServerSocketChannel устраняет эту странную проблему.

Кроме того, Клиент может изменить работу с Nio. В следующем примере я буду использовать java.nio:

final SocketChannel c = SocketChannel.open(); 
    c.connect(new InetSocketAddress("localhost", 8007)); 

    final ByteBuffer buf = ByteBuffer.allocate(5); 

    // fill Buffer 
    buf.put((byte) 0x0); 
    buf.put("Test".getBytes(CharsetUtil.UTF_8)); 
    // Flip buffer 
    buf.flip(); 

    // Write buffer to socket 
    while (buf.hasRemaining()) { 
     c.write(buf); 
    } 

    System.out.println("Reading ..."); 

    // Read 
    buf.flip(); 
    while (true) { 
     int n = c.read(buf); 
     if (n < 0) { 
      break; 
     } 
     final String d = new String(buf.array()); 
     if(!d.isEmpty()) System.out.println("'" + d + "'"); 
     buf.clear(); 
    } 

    // Finish Programm 
    System.out.println("- DONE -"); 
    c.close(); 

Этот пример работает отлично. Очевидно, проблема была прямо в моих глазах.

Теперь это исправлено.

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