ps:Netty服务端主动关闭问题

本文探讨了在Netty服务端如何主动关闭连接的方法,包括通过`ctx.channel().parent().close()`直接关闭服务器套接字通道,以及设置外部调用的静态关闭服务器方法。在测试过程中,创建了两个线程,一个用于连接服务器,另一个用于关闭服务器。为了避免未连接即关闭的情况,关闭线程前加了30秒延迟。同时,文章提到了尝试使用`synchronized`关键字同步对象以避免静态方法的尝试,但遇到了阻塞问题,未能成功唤醒阻塞线程。问题在于`sync()`锁定的对象及如何唤醒阻塞线程,暗示可能需要深入研究Netty的底层实现。

之前主动关闭nettyserver是在serverhandler中通过ctx.channel().parent().close();直接关闭serversocketchannel,触发关闭事件,使得sync()不在阻塞线程。
另外的方法就是设置一个静态的关闭服务器方法,在外部调用。方法的具体代码之前也有提及,这篇主要是进行测试。
主要是服务端测试:

public class TestServer {
    Remote_game_interface Tx_net = new Player_info_find(); // 接口实现类,也就是服务
    NettyRpcServer rpcServer = new NettyRpcServer("127.0.0.1", 9999); //服务器
    Runnable connect = new Runnable() {
        @Override
        public void run() {
            rpcServer.serviceRegister(Tx_net);
            rpcServer.connect();
        }
    };

    Runnable close = new Runnable() {
        @Override
        public void run() {
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("开始断开服务器");
                NettyRpcServer.closeServer();
        }
    };
    public static void main(String[] args) throws InterruptedException {
        TestServer test = new TestServer();
        Thread close = new Thread(test.close);
        close.start();
        Thread connect = new Thread(test.connect);
        connect.start();
    }

}

主要思路就是创建两个线程,一个是连接服务器线程,逻辑和之前的测试连接思路一样;另外一个是关闭线程,直接调用暴露出来的强制关闭服务器方法。需要注意的是在关闭线程close前面加一个延时30s,防止还未连接就关闭,达不到测试效果。同时sync()阻塞的是connect线程,因此在main函数中connect和close的启动顺序无所谓。
PPS:
之前有一个弯路,想要把new出来的rpcServer对象同步,也就是synchronized (rpcserver),实现两个线程对该对象进行操作,这样强制关闭的方法不需要是静态的了。使用同步代码块需要在close线程中获取rpcserver的锁。然后调用notify()方法来唤醒connect线程。但是由于阻塞的问题,close线程拿不到锁(sync()底层源码来看锁的谁嘛?),因此也无法对connect线程唤醒。
问题就在sync()锁的谁呢?除了netty自带的close方法还有什么方法来唤醒阻塞线程?可能要抠底层了⑧。。。下面是不成功的代码

public class TestServer {
    Remote_game_interface Tx_net = new Player_info_find(); // 接口实现类,也就是服务
    NettyRpcServer rpcServer = new NettyRpcServer("127.0.0.1", 9999); //服务器
    Runnable connect = new Runnable() {
        @Override
        public void run() {
            synchronized (rpcServer){
                rpcServer.serviceRegister(Tx_net);
                rpcServer.connect();
            }

        }
    };

    Runnable close = new Runnable() {
        @Override
        public void run() {
            synchronized (rpcServer){
                try {
                    Thread.sleep(30000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("开始断开服务器");
                rpcServer.notify();
            }

        }
    };
    public static void main(String[] args) throws InterruptedException {
        TestServer test = new TestServer();
        Thread connect = new Thread(test.connect);
        connect.start();
        Thread close = new Thread(test.close);
        close.start();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值