2014-09-10 2 views
5

मैं नेटटी के साथ अपना पहला कदम बनाने की कोशिश कर रहा हूं, इस उद्देश्य के लिए मैंने ओटी सादे टीसीपी पर नेटटी और सरल क्लाइंट पर सरल सर्वर लिखा था।नेटटी चैनल। लिखना संदेश नहीं लिख रहा

ग्राहक यादृच्छिक पाठ पैकेट भेजता है, और उसे "एएके" संदेश प्राप्त करना होगा। हैंडलर विधि देखें:

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 

    ctx.write("Ack"); 
    ctx.flush(); 

    ByteBuf in = (ByteBuf) msg; 
    StringBuilder sb = new StringBuilder(); 
    try { 
     while (in.isReadable()) { 
      sb.append((char) in.readByte()); 

     } 
    } finally { 
     ReferenceCountUtil.release(msg); 
    } 
    LOG.debug("Incoming message. ACK was send"); 

    String myaddr = ctx.channel().remoteAddress().toString(); 
    String message = "Message from " + myaddr + " :" + sb.toString(); 
    LOG.debug(message); 
    sendToOther(myaddr, message); 

} 

समस्या है - जब मैं "Ack" स्ट्रिंग वापस भेजने का प्रयास करें - ग्राहक कुछ भी नहीं प्राप्त करता है। लेकिन जब मैं आने वाले संदेश को वापस भेजने का प्रयास करता हूं - यह ठीक काम करता है, और मैं अपने क्लाइंट में गूंजता हूं।

@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 

    ctx.write(msg); 
    ctx.flush(); 

लिखने() विधि को ऑब्जेक्ट की आवश्यकता है और मैंने (ऑब्जेक्ट) स्ट्रिंग भेजने की कोशिश की - लेकिन कुछ भी नहीं हुआ। मैंने बाइटबफ भेजने की भी कोशिश की (मैंने इसे एक लेख में देखा) और यह अभी भी काम नहीं कर रहा है।

जब मैं आने वाले संदेश को गूंज के रूप में वापस भेजता हूं - यह काम करता है। जब मैं कुछ और भेजता हूं - यह नहीं करता है। कृपया मेरी मदद करें, मैं सिर्फ यह नहीं समझ सकता कि मेरी गलती कहां है।


मैंने इस समस्या को हल किया। प्वाइंट था, कि आपको केवल बाइटबफ भेजने की जरूरत है। तो हमें इसे बनाने की ज़रूरत है, और इसे कुछ लिखना है और केवल तभी हम इसे चैनल पाइप में लिख सकते हैं। मेरे मामले में यह था:

String ack = "ACK"; 
    ByteBuf out = ctx.alloc().buffer(ack.length()*2); 
    out.writeBytes(ack.getBytes()); 
    ctx.write(out); 
    ctx.flush(); 
    LOG.debug("Incoming message. ACK was send"); 

हो सकता है कि यह अत्यधिक संवेदना न हो, लेकिन यह उदाहरण के रूप में काम करता है।

उत्तर

16

आप क्यों यह विफल रहता है देखेंगे यदि आप निम्नलिखित के साथ अपने serverHandler में अपने

ctx.write("Ack"); 
ctx.flush(); 

बदल देते हैं:

ChannelFuture cf = ctx.write("Ack"); 
ctx.flush(); 
if (!cf.isSuccess()) { 
    System.out.println("Send failed: " + cf.cause()); 
} 

यह आप एक संदेश कह रही है कि String समर्थित नहीं है देना चाहिए। आपके उत्तर के लिए

ByteBuf in = (ByteBuf) msg; 
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8)); 
+0

Thanx:

ByteBuf हालांकि काम करना चाहिए:

ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8)); ctx.flush(); 

ग्राहक के पक्ष संपादित करें पर channelRead विधि! आपका समाधान खुद को ढूंढने से बेहतर है। – Asprelis

संबंधित मुद्दे