2014-09-04 2 views
-1

Я использую netty для изменения наших серверов для поддержки nio. Мне также нужно изменить клиентов для поддержки nio или они могут работать так, как они есть.Может ли сервер блокироваться и блокировать клиентов

EDIT: Я написал небольшой тест, я могу отправить данные на Сервер, но данные, отправленные сервером на клиент, не получены.

Пожалуйста, смотрите пример кода ниже: SERVER:

public class NettyNioServer { 
    private static final int BACKLOG = 1000; 
    private final int port; 

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

    public void start() throws Exception{ 
     EventLoopGroup bossGroup = new NioEventLoopGroup(); 
     EventLoopGroup workerGroup = new NioEventLoopGroup(); 
     try{ 
      final ChannelInitializer<SocketChannel> channelInitializer = new BasicSocketChannelInitializer(); 
      ServerBootstrap b = new ServerBootstrap(); 
      b.group(bossGroup, workerGroup) 
      .channel(NioServerSocketChannel.class) 
      .childHandler(channelInitializer) 
      .option(ChannelOption.SO_BACKLOG, BACKLOG) 
      .option(ChannelOption.SO_KEEPALIVE, true); 
      ChannelFuture f = b.bind(port).sync(); 
      System.out.println("* * * Mediation Server Started on Port: "+port+" * * *"); 
      Main.getLogWrapper1().log(Level.INFO, "* * * Mediation Server Started on Port: "+port+" * * *"); 
      f.channel().closeFuture().sync(); 
     }catch(Exception e){ 
      Main.getLogWrapper1().log(Level.FATAL, "***** Could not listen on Port ****"); 
      StringWriter sw = new StringWriter(); 
      e.printStackTrace(new PrintWriter(sw)); 
      Main.getLogWrapper1().log(Level.FATAL, sw.toString()); 
      e.printStackTrace(); 
     }finally{ 
      workerGroup.shutdownGracefully(); 
      bossGroup.shutdownGracefully(); 
     } 
    } 
} 

public class BasicNioServerHandler extends ChannelInboundHandlerAdapter{ 

    @Override 
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 
     String message = (String) msg; 
     try{ 
      System.out.println(message); 
      if (message != null && message.length()>0) { 
       //New Code Start Here 
       FrameProcessor frameProcessor = new FrameProcessor(null,Main.getLogWrapper1(),new Util()); 
       final String msgResponse = frameProcessor.frameDataProcess(message,"");    
       final ChannelFuture f = ctx.writeAndFlush(msgResponse+"\r\n"); 
       f.addListener(new ChannelFutureListener() { 
        @Override 
        public void operationComplete(ChannelFuture future) throws Exception { 
         System.out.println("Message Sent to COMM: ACK="+msgResponse); 
        } 
       }); 

      } 
     }finally{ 
      ReferenceCountUtil.release(msg); 
     } 
    } 

    @Override 
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 
     cause.printStackTrace(); 
     Main.getLogWrapper1().log(Level.ERROR, cause.getMessage()); 
     //ctx.close(); 
    } 
} 

public class BasicSocketChannelInitializer extends ChannelInitializer<SocketChannel>{ 

    private static final StringDecoder STRING_DECODER = new StringDecoder(CharsetUtil.UTF_8); 
    private static final StringEncoder STRING_ENCODER = new StringEncoder(CharsetUtil.UTF_8); 

    @Override 
    protected void initChannel(SocketChannel ch) throws Exception { 
     ChannelPipeline pipeline = ch.pipeline(); 
     //Decoders 
     pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); 
     pipeline.addLast("stringDecoder", STRING_DECODER); 
     pipeline.addLast(new BasicNioServerHandler()); 
     //Encoders 
     pipeline.addLast("stringEncoder", STRING_ENCODER); 
    } 

} 

Блокирующий Клиент:

try{ 
     socket = new Socket("127.0.0.1", 5552); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     input = new DataInputStream(socket.getInputStream()); 
    } catch (UnknownHostException e) { 
     System.out.println("Unknown host"); 
     System.exit(1); 
    } catch (IOException e) { 
     System.out.println("No I/O"); 
     System.exit(1); 
    } 
out.println(text); 
     System.out.println("Data Sent :" + text); 


//Receive text from server 
     try{ 
     //String line = in.readLine(); 
      byte[] buffer =new byte[100]; 
      int bytes = input.read(buffer); 
      System.out.println("Data Received From Server :" + new String(buffer)); 
     } catch (IOException e){ 
    System.out.println("Read failed"); 
     System.exit(1); 
     } 

Примечание как Readline и читать (байт []) не получает сообщение. В то время как ChannelFuture печатает сообщение, как успешно отправленное. Также я отправил простую строку, строку + "\ r \ n", строку + "\ n", но я не получаю сообщение на клиенте.

ответ

0

Да. Это все TCP. Блокирование/неблокирование/асинхронность - это свойства API, а не протокола.

+0

См. Отредактированный вопрос и дайте мне знать, почему я не могу получить ответ как клиент. – gladiator

+0

Теперь вы задаете совершенно другой вопрос. Вы не указали никаких доказательств того, что что-либо когда-либо отправляется. У вас есть двойная обратная косая черта, где у вас должен быть один. – EJP

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