1. package cn.enjoyedu.udp.unicast;
    2. import io.netty.buffer.Unpooled;
    3. import io.netty.channel.ChannelHandlerContext;
    4. import io.netty.channel.SimpleChannelInboundHandler;
    5. import io.netty.channel.socket.DatagramPacket;
    6. import io.netty.util.CharsetUtil;
    7. import java.net.InetSocketAddress;
    8. import java.util.Random;
    9. /**
    10. * 类说明:应答Handler
    11. */
    12. public class AnswerHandler extends
    13. SimpleChannelInboundHandler<DatagramPacket> {
    14. /*应答的具体内容从常量字符串数组中取得,由nextQuote方法随机获取*/
    15. private static final String[] DICTIONARY = {
    16. "只要功夫深,铁棒磨成针。",
    17. "旧时王谢堂前燕,飞入寻常百姓家。",
    18. "洛阳亲友如相问,一片冰心在玉壶。",
    19. "一寸光阴一寸金,寸金难买寸光阴。",
    20. "老骥伏枥,志在千里,烈士暮年,壮心不已" };
    21. private static Random r = new Random();
    22. private String nextQuote(){
    23. return DICTIONARY[r.nextInt(DICTIONARY.length-1)];
    24. }
    25. @Override
    26. protected void channelRead0(ChannelHandlerContext ctx,
    27. DatagramPacket packet)
    28. throws Exception {
    29. /*获得请求*/
    30. String req = packet.content().toString(CharsetUtil.UTF_8);
    31. System.out.println("接收到请求:"+req);
    32. if(UdpQuestionSide.QUESTION.equals(req)){
    33. String answer = UdpAnswerSide.ANSWER+nextQuote();
    34. System.out.println("接收到请求:"+req);
    35. /**
    36. * 重新 new 一个DatagramPacket对象,
    37. * 我们通过packet.sender()来获取发送者的消息。重新发送出去!
    38. */
    39. ctx.writeAndFlush(
    40. new DatagramPacket(
    41. Unpooled.copiedBuffer(answer,CharsetUtil.UTF_8),
    42. packet.sender()
    43. )
    44. );
    45. }
    46. }
    47. @Override
    48. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
    49. throws Exception {
    50. ctx.close();
    51. cause.printStackTrace();
    52. }
    53. }