2014-09-26 4 views
-1

간단한 응용 프로그램에서 작업하고 있습니다. 예외를 이해하려고하는데, 그럴 수 없습니다. > 유효한 응답, 서버 + 클라이언트 작업 고급 - 클라이언트와의 Netty 서버에 연결의 Netty 서버를 Netty Server에 두 번 연결할 수 없습니다.

  • 시작

    1. :

      재현하는 방법

      .

    2. 클라이언트 폐쇄 (0 채널은 디버그 스레드에 의해 입증 된 활성)
    3. NEW 클라이언트 읽기를 시도 -> 오류 : java.net.SocketException의 : 소프트웨어 때문에 연결이 중단되었습니다 : RECV는
    4. 는 서버, 고토 2를 다시 시작 실패 .

    서버 소스 :

    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()); 
    } 
    

    서버가 요청을 처리하지만 올바른 메시지를 읽을 수 없습니다.

    내 고객 : Client.main을 ( https://github.com/BjoernAkAManf/Chat

    시작 Server.main (문자열 []에 args) 실행 :

    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

    예제 응용 프로그램을 사용하여 String [] args)를 두 번 반복합니다. 먼저 적절한 출력을 얻습니다. 두 번째 실행이 실패합니다. 나는 아마도 내가 생각할 수있는 모든 것을 시험했다. 정말 여기에 도움을 주셔서 감사합니다. 고마워요

  • +0

    의견이 없으면 Downvoting. 꽤 멋지 네요. 나는 모든 프로그램을 스스로 디버깅하려고 노력하고 있습니다. 며칠 동안 열심히 일하고 있습니다. 아무에게도 불쾌감을 줄 의도는 아니지만, 질문을 downvote하면 적어도 나에게 이유를 말해주십시오. -이 문제는 재현하기 쉽고, 직접 테스트하십시오. . 문제가 어떻게 든 내 처리기와 관련이 있으면 예외가 던져 지거나 어딘가에 인쇄됩니다. 아무도 내 논리에 결함이 있어야합니다. 아무도이 문제를 이전에보고 한 적이 없으며 여기서 마구간을 사용하고 있습니다. – manf

    답변

    0

    첫 번째 아이디어에도 불구하고 이것은 '진짜'서버 문제가 아니며 netty에도 문제가 아닙니다. 클라이언트는 oio (java.io) 소켓을 사용하여 Nio Netty Server에 연결합니다.

    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(); 
    

    이 예제는 완벽하게 정상적으로 작동합니다. 분명히 문제는 내 눈앞에서 옳았다.

    이제 수정되었습니다.

    관련 문제