我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么利用JAVA实现可以自行关闭服务器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么利用JAVA实现可以自行关闭服务器

这篇文章将为大家详细讲解有关怎么利用JAVA实现可以自行关闭服务器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

JAVA实现可以自行关闭的服务器

普通实现的服务器都无法关闭自身,只有依靠操作系统来强行终止服务程序。这种强行终止服务程序的方式尽管简单方便,但会导致服务器中正在执行的任务突然中断。如果服务器处理的任务非常重要,不允许被突然中断,应该由服务器自身在恰当的时刻关闭自己

代码如下:

  • EchoServer类

package ShutdownServer;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.net.SocketTimeoutException;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.RejectedExecutionException;import java.util.concurrent.TimeUnit;public class EchoServer {    private int port=8000;    private ServerSocket serverSocket;    private ExecutorService executorService; //线程池    private final int POOL_SIZE=4; //单个CPU时线程池中工作线程的数目    private int portForShutdown=8001; //用于监听关闭服务器命令的端口    private ServerSocket serverSocketShutdown;    private boolean isShutdown=false; //服务器是否已经关闭    private Thread shutdownThread=new Thread(){        //负责关闭服务器的线程        public void run(){            while(!isShutdown){                Socket socketForShutdown=null;                try{                    socketForShutdown=serverSocketShutdown.accept();                    BufferedReader br=new BufferedReader(                            new InputStreamReader(socketForShutdown.getInputStream())                    );                    String command=br.readLine();                    if (command.equals("shutdown")){                        long beginTime=System.currentTimeMillis();                        socketForShutdown.getOutputStream().write("服务器正在关闭\r\n".getBytes());                        isShutdown=true;                        //请求关闭线程池                        //线程池不再接收新的任务,但会继续执行完工作队列中现有的任务                        executorService.shutdown();                        //等待关闭线程池,每次等待的超时时间为30s                        //当使用awaitTermination时,主线程会处于一种等待的状态,等待线程池中所有的线程都运行完毕后才继续运行。                        //如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。执行分线程已结束                        //如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。不执行分线程已结束                        //如果等待时间没有超过指定时间,等待!                        //可以用awaitTermination()方法来判断线程池中是否有继续运行的线程。                        while(!executorService.isTerminated())                            executorService.awaitTermination(30, TimeUnit.SECONDS);                            //关闭与EchoClient客户通信的ServerSocket                            serverSocket.close();                            long endTime=System.currentTimeMillis();                            socketForShutdown.getOutputStream().write(("服务器关闭,"+"关闭服务器用了"+(endTime-beginTime)+"ms\r\n").getBytes());                            socketForShutdown.close();                            serverSocketShutdown.close();                            System.out.println("服务器关闭");                    }                    else {                        socketForShutdown.getOutputStream().write("错误的命令\r\n".getBytes());                        socketForShutdown.close();                    }                } catch (Exception e) {                    e.printStackTrace();                }            }        }    };    public EchoServer() throws IOException {        serverSocket=new ServerSocket(port);        //设定等待客户连接的超时时间为60s        serverSocket.setSoTimeout(60000);        serverSocketShutdown=new ServerSocket(portForShutdown);        //创建线程池        executorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE);        shutdownThread.start();        System.out.println("服务器启动");    }    public void service(){        while(!isShutdown){            Socket socket=null;            try {                //可能会抛出SocketTimeoutException和SocketException                socket=serverSocket.accept();                //把等待客户发送数据的超时时间设为60s                socket.setSoTimeout(60000);                //可能会抛出RejectedExecutionException                executorService.execute(new Handler(socket));            }catch (SocketTimeoutException e){                //不必处理等待客户连接时出现的异常            }catch (RejectedExecutionException e) {                try {                    if (socket != null)                        socket.close();                } catch (IOException ex) {                    return;                }            }catch (SocketException e){                if (e.getMessage().indexOf("socket closed")!=-1)                    return;            }catch (IOException e){                e.printStackTrace();            }        }    }    public static void main(String[] args) throws IOException { //main方法抛出异常,异常直接交给虚拟机,虚拟机直接结束异常        new EchoServer().service();    }}//负责与单个客户通信的任务class Handler implements Runnable{    private Socket socket;    public Handler(Socket socket){        this.socket=socket;    }    private PrintWriter getWriter(Socket socket) throws IOException{        OutputStream socketOut=socket.getOutputStream();        return new PrintWriter(socketOut,true);    }    private BufferedReader getReader(Socket socket) throws IOException{        InputStream socketIn=socket.getInputStream();        return new BufferedReader(new InputStreamReader(socketIn));    }    public String echo(String msg){        return "echo: "+msg;    }    @Override    public void run() {        try{            System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());            BufferedReader br=getReader(socket);            PrintWriter pw=getWriter(socket);            String msg=null;            //接收和发送数据,直到通信结束            while((msg=br.readLine())!=null){                System.out.println("from "+socket.getInetAddress()+":"+socket.getPort()+">"+msg);                pw.println(echo(msg));                if (msg.equals("bye"))                    break;            }        } catch (IOException e) {            e.printStackTrace();        }finally{            try{                if (socket!=null)                    socket.close();            }catch (IOException e){                e.printStackTrace();            }        }    }}
  • AdminClient类(负责向EchoServer发送“shutdown”命令,关闭服务器)

package ShutdownServer;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;public class AdminClient {    public static void main(String[] args){        Socket socket=null;        try{            socket=new Socket("localhost",8001);            //发送关闭命令            OutputStream socketOut=socket.getOutputStream();            //Scanner scanner=new Scanner(System.in);            //String order=scanner.next();            socketOut.write("shutdown\r\n".getBytes());            //接收服务器反馈            BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));            String msg=null;            while ((msg=br.readLine())!=null){                System.out.println(msg);            }        } catch (Exception e) {            e.printStackTrace();        }finally {            try{                if (socket!=null)                    socket.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}
  • Client类(客户,与服务器进行通讯)

package ShutdownServer;import java.io.*;import java.net.Socket;public class Client {    private String host="localhost";    private int port=8000;    private Socket socket;    public Client() throws IOException {        socket=new Socket(host,port);    }    private PrintWriter getWriter(Socket socket) throws IOException{        OutputStream socketOut=socket.getOutputStream();        return new PrintWriter(socketOut,true);    }    private BufferedReader getReader(Socket socket) throws IOException{        InputStream socketIn=socket.getInputStream();        return new BufferedReader(new InputStreamReader(socketIn));    }    public void talk() throws IOException{        try{            BufferedReader br=getReader(socket);            PrintWriter pw=getWriter(socket);            BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));            String msg=null;            while((msg=localReader.readLine()) != null){                pw.println(msg);                System.out.println(br.readLine());                if (msg.equals("bye")){                    break;                }            }        }catch (IOException e){            e.printStackTrace();        }        finally {            try{                socket.close();            }catch (IOException e){                e.printStackTrace();            }        }    }    public static void main(String args[]) throws IOException {        new Client().talk();    }}

shutdownThread线程负责关闭服务器,它一直监听8001端口,如果接收到了AdminClient发送的“shutdown”命令,就把isShutdown设置为true。

在关闭服务器时,我们使用了最常用的方法,先调用线程池的shutdown()方法,接着调用线程池的awaitTermination()方法。

executorService.shutdown();                        //等待关闭线程池,每次等待的超时时间为30s                        //当使用awaitTermination时,主线程会处于一种等待的状态,等待线程池中所有的线程都运行完毕后才继续运行。                        //如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。执行分线程已结束                        //如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。不执行分线程已结束                        //如果等待时间没有超过指定时间,等待!                        //可以用awaitTermination()方法来判断线程池中是否有继续运行的线程。                        while(!executorService.isTerminated())                            executorService.awaitTermination(30, TimeUnit.SECONDS);

在线程池执行了shutdown()方法后,线程池不会在接收新的任务,同时该线程因为调用awaitTermination()方法而发生阻塞,直到线程池中所有线程的任务执行完毕,该线程才会继续向下

运行结果

先运行EchoServer,Client,AdminClient后,再开启一客户程序Client1,显示Client1无法被加入线程池

  • EchoServer(只显示连接了Client,未连接Client1)

怎么利用JAVA实现可以自行关闭服务器

  • Client

怎么利用JAVA实现可以自行关闭服务器

  • Client2(向服务器发送消息,收到null)

怎么利用JAVA实现可以自行关闭服务器

  • AdminClient(在Client没有运行结束时,被阻塞)

怎么利用JAVA实现可以自行关闭服务器

当Client输入“bye”结束运行后,AdminClient关闭服务器

  • Client类

怎么利用JAVA实现可以自行关闭服务器

  • EchoServer类

怎么利用JAVA实现可以自行关闭服务器

  • AdminClient类

怎么利用JAVA实现可以自行关闭服务器

关于“怎么利用JAVA实现可以自行关闭服务器”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么利用JAVA实现可以自行关闭服务器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么利用JAVA实现可以自行关闭服务器

这篇文章将为大家详细讲解有关怎么利用JAVA实现可以自行关闭服务器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA实现可以自行关闭的服务器普通实现的服务器都无法关闭自身,只有依靠操作系统来强行终止服
2023-06-20

服务器的真实IP怎么利用java进行获取

这篇文章将为大家详细讲解有关服务器的真实IP怎么利用java进行获取,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。实现代码:import java.io.BufferedReader;imp
2023-05-31

java中怎么使用try-with-resource实现输入输出流自动关闭

本篇内容介绍了“java中怎么使用try-with-resource实现输入输出流自动关闭”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!tr
2023-06-20

阿里云服务器不用了怎么关闭自动续费服务

如果您不再使用阿里云的服务器,可以通过以下方法关闭自动续费服务:使用阿里云的客户端或APP进行关闭操作。您可以使用浏览器访问阿里云官网,在页面底部的“登录”或“账号”页面,输入阿里云账户及密码,进行登录或关闭续费服务。联系您的阿里云客户服务部门或技术支持部门,他们将协助您关闭服务。在阿里云的网站或应用程序中进行关闭操作。您可以查看阿里云提供的帮助文档,了解相关操作步骤。联系您的阿里云客
2023-10-26

利用java怎么与web服务器进行链接

本篇文章给大家分享的是有关利用java怎么与web服务器进行链接,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。java 与web服务器链接使用net.Socket类sock.g
2023-05-31

阿里云服务器不用了怎么关闭自动续费

如果您不再使用阿里云的服务器,可以通过以下方法关闭自动续费:登录阿里云官网:https://cloud.aliyun.com使用阿里云账号进行登录:https://www.aliyun.com/console/register查看您的账户中是否有自动续费选项:在服务设置中,可以找到是否开启自动续费选项。联系客户支持:如果您的账户中没有自动续费选项,可以联系阿里云客户支持进行续费。以
2023-10-26

云服务器怎么实现高可用

云服务器高可用性实现高可用性对云服务器至关重要,可确保在故障下不间断服务。本文探索实现高可用性的方法:备份和恢复:定期备份数据,利用快照功能快速恢复。冗余架构:使用负载均衡器和故障转移机制创建服务器副本。自动化和监控:利用工具检测故障并触发恢复,持续监视服务器性能。云服务提供商功能:选择支持高可用性的提供商,利用可用性区域和管理工具。分层方法、灾难恢复演练和持续更新可提高高可用性。通过这些措施,企业可以降低故障影响,确保服务不间断交付。
云服务器怎么实现高可用
2024-04-11

云服务器怎么实现高可用

要实现云服务器的高可用性,可以采取以下措施:1. 使用负载均衡:将流量均匀地分发到多台服务器上,避免单点故障,提高系统的可用性。2. 配置冗余系统:通过使用冗余服务器,当一台服务器出现故障时,可以自动切换到备用服务器上,保证服务的连续性。3
2023-09-22

阿里云服务器不用了怎么关闭自动续费服务功能

如果您的阿里云服务器不再使用了,但仍然想要关闭自动续费服务功能,以便不用每月支付费用。以下是一些方法:查看是否有自动续费服务:如果您的阿里云服务器没有续费选项,您可以检查是否有自动续费服务,以了解是否需要进行手动操作。联系客服:如果您使用的是阿里云的账户,您可以联系阿里云的客服,询问如何关闭自动续费服务功能。客服将为您提供帮助和建议。使用在线服务:如果您有阿里云的在线服务,可以在阿里云网
2023-10-26

怎么在Java中利用AQS实现一个自定义同步器

这篇文章主要为大家详细介绍了怎么在Java中利用AQS实现一个自定义同步器,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,
2023-06-06

Java中的多线程回显服务器怎么利用Socket实现

Java中的多线程回显服务器怎么利用Socket实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:需要两个类,一个是EchoServer,代表服务器。另外一个是Ech
2023-05-31

阿里云服务器不用了怎么关闭自动续费功能

如果您的阿里云服务器不再使用了,但仍然想要关闭自动续费功能,以下是一些常见的步骤:在阿里云控制台的"客户端">"系统设置">"自动续费"中打开。在弹出的对话框中,确认您选择了关闭自动续费选项。点击"确定"以关闭自动续费功能。如果您的阿里云服务器还处于在线状态,请在"系统设置">"在线"中重新勾选该选项。如果您的阿里云服务器仍然在使用中,请在"系统设置"
2023-10-26

阿里云服务器不用了怎么关闭自动续费功能呢

如果您已经停止了阿里云的服务,但仍然希望关闭自动续费功能,可以按照以下步骤操作:1.登录阿里云网站,点击左上角的“帮助与支持”链接。2.在帮助与支持页面中,找到“关于阿里云服务器”的文档。3.在文档中,找到“服务器自动续费”这个选项,然后点击下拉菜单。4.在下拉菜单中,找到“关闭自动续费”选项,勾选即可。5.点击自动续费即可。希望这些步骤能够对您有所帮助。
2023-10-26

轻量应用服务器是什么意思呀怎么关闭程序运行

轻量应用服务器通常用于为移动设备或平板电脑等轻量级设备提供应用程序管理和部署服务,以及与其它应用程序协同工作的能力。因此,要终止程序运行,只需按下“停止”按钮即可完成。轻量应用服务器通常具有以下特点:轻量级:相对于其他应用程序,轻量应用服务器的设计非常简单,使用较少的内存和CPU资源。快速运行:轻量应用服务器通常具有快速的反应速度,可以在短时间内启动并加载应用程序,而不会对其运行造成任何影
2023-10-26

轻量应用服务器是什么意思啊怎么关闭程序运行

轻量应用服务器通常用于提供低负载应用程序的运行环境,例如Web应用程序。在关闭程序的运行时,需要按照以下步骤进行操作:检查服务端配置信息,确定程序是否需要启用负载均衡(例如,Apache、GoogleAppEngine等),以及是否需要安装相关的负载均衡软件。根据应用程序的不同,可能会对服务器进行配置,例如,将应用程序的数据库链接配置为可用的数据库服务器或者将应用程序的配置信息配置为自动更
2023-10-26

阿里云服务器不用了怎么关闭自动续费功能呢苹果

如果您已经将阿里云服务器停用了,但是您想要关闭自动续费功能,以下是几种不同的方法:登录阿里云控制台:打开阿里云控制台,在“服务器”选项卡中,右键单击“我的云服务器”图标,然后选择“停用”。在网站上进行操作:如果您已经停用阿里云服务器并且不再使用该服务,您可以在网站上进行相关操作,例如:在阿里云控制台中查找“停用”或“自动续费”选项。在弹出的“停用服务器设置”或&l
2023-10-27

怎么用expect实现ssh自动登录服务器并进行批量管理

本篇内容主要讲解“怎么用expect实现ssh自动登录服务器并进行批量管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用expect实现ssh自动登录服务器并进行批量管理”吧!shell代
2023-06-09

shell中怎么利用sendmail实现服务器监控报警

shell中怎么利用sendmail实现服务器监控报警,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下:wget 2023-06-09

编程热搜

目录