Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java通信网络服务器-套接字客户端_Java_Sockets_Netty - Fatal编程技术网

Java通信网络服务器-套接字客户端

Java通信网络服务器-套接字客户端,java,sockets,netty,Java,Sockets,Netty,对于聊天服务器项目,我使用netty作为服务器,处理程序中包含以下代码: public class PacketHandler extends ChannelInboundHandlerAdapter{ @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf in = (ByteBuf) msg; try

对于聊天服务器项目,我使用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”)
将消息发送回我的客户机,就像echo服务器一样

以下是客户代码:

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)
,客户端正在发送空垃圾邮件,但我没有收到我的消息,没有显示任何内容,我真的不知道为什么

我不能在客户端使用netty,因为这只是出于测试目的,最终的客户端将用C#(Unity Engine)编写,所以我不能在这一个中使用netty,我必须使用本机套接字处理

编辑:

根据wireshark的说法,来自客户端的数据包已发送,但服务器的应答未发送,我没有看到来自服务器的包含“礼炮1”的数据包。

您做到了:

ctx.write(msg+"\r\n");
msg
不是
String
而是
ByteBuf
。如果要将
\r\n
附加到收到的消息,应执行以下操作:

in.writeByte('\r');
in.writeByte('\n');
ctx.write(in);
此外,由于您将收到的消息(中的
)重新用作响应,因此不应释放它:

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

如果您确实打算调用
ctx.write(msg+“\r\n”)
,请确保您的管道具有
StringEncoder

在执行
ctx.write()
之后,我尝试刷新,但仍然存在相同的问题。
readLine()
在流结束时返回null,这在对等机断开连接时发生。您需要对此进行测试,并在获得连接后断开并关闭连接。事实上,问题来自try块的
部分,该版本使我无法正确回复。