【问题标题】:Java Communication netty server - Socket clientJava 通信 netty 服务器 - Socket 客户端
【发布时间】:2015-03-18 15:27:40
【问题描述】:

对于聊天服务器项目,我使用 netty 作为服务器,在我的处理程序中使用以下代码:

public class PacketHandler extends ChannelInboundHandlerAdapter{

        @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
            ByteBuf in = (ByteBuf) msg;
            try {
                AbstractClientPacket packet = ClientPacketHandler.handle(in);
                if(packet != null && packet.read()){
                    packet.run();
                    ctx.write(msg+"\r\n");
                }
            } finally {
                ReferenceCountUtil.release(msg);
            }
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            cause.printStackTrace();
            ctx.close();
        }
}

所以,我的数据包得到了正确处理,并且工作正常,但是,我使用ctx.write(msg+"\r\n"); 将消息发送回我的客户端,就像一个回显服务器。

这是客户的代码:

public class ChatClient {

    static Socket socket;
    static DataOutputStream out;
    static BufferedReader in;

    public static void main(String[] args){

        try {
            initSocket();

            String test = "Salut 1";

            TestPacket packet = new TestPacket(0x18,test.getBytes());

            sendPacket(packet);

            while(true){
                try {

                    String message = in.readLine();
                    System.out.println(message);

                } catch (IOException e) {

                    e.printStackTrace();
                }
            }

            //TEST
        } catch (IOException  e) {
            e.printStackTrace();
        }finally{
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private static void initSocket(){
        try {
            socket = new Socket("localhost",58008);
            out = new DataOutputStream(socket.getOutputStream());
            in = new BufferedReader(new InputStreamReader((socket.getInputStream())));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void sendPacket(TestPacket p) throws IOException{
        out.write(p.getRawData());
        out.flush();
    }
}

数据包已正确发送,但我没有收到任何回复,当我停止服务器时,由于我的while(true),客户端正在向 null 发送垃圾邮件,但我没有收到我的消息,没有显示任何内容,我真的不知道为什么。

客户端不能使用netty,因为这个只是为了测试,最终的客户端会用C#(Unity Engine)写,所以我不能在这个中使用netty,我必须这样做使用本机套接字处理。

编辑:

根据wireshark,来自客户端的数据包已发送,但服务器没有回答,我没有看到来自服务器的数据包包含“Salut 1”。

【问题讨论】:

  • 我在做ctx.write() 后尝试冲洗,但还是同样的问题。
  • readLine() 在流结束时返回 null,这在对等方断开连接时发生。您需要对此进行测试,并在获得连接时断开和关闭连接。

标签: java sockets netty


【解决方案1】:

你做到了:

ctx.write(msg+"\r\n");

msg 不是String,而是ByteBuf。如果您想将\r\n 附加到收到的消息中,您应该执行以下操作:

in.writeByte('\r');
in.writeByte('\n');
ctx.write(in);

另外,因为您重复使用收到的消息 (in) 作为响应,所以您不应该释放它:

// Do NOT call this.
ReferenceCountUtil.release(in);

如果您确实打算致电ctx.write(msg + "\r\n"),请确保您的管道有StringEncoder

【讨论】:

  • 实际上问题出在 try 块的 finally 部分,该版本让我无法正确回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2012-06-27
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多