BufferedReader的readLine()为非阻塞

  BufferedReader的readLine()为非阻塞,阻塞部分主要在Socket clientSocket = serverSocket.accept(); 
public class ShutDownServer {  
  
    static ServerSocket serverSocket = null;// 服务socket  
  
    public static void main(String[] args) {  
        try {  
            // 监听30000端口  
       	 System.out.println("before ServerSocket  "+new Date()); 
            serverSocket = new ServerSocket(30000);  
            System.out.println("ShutDownServer is listening  port 30000............");  
            System.out.println("after ServerSocket  "+new Date()); 
            int i=0;
          //  while (true) {  
                // 获取客户端套接字  
            	 
                Socket clientSocket = serverSocket.accept();  
                
                try {  
                             
                    BufferedReader input=null;
                    
            		input=new BufferedReader(new InputStreamReader
            				(clientSocket.getInputStream()));
            		  
            		while(true){
            	         //  System.out.println("阻塞到了input.readLine()"); 
            		 //	while(input.ready()){
            			
                            String msg = input.readLine();  
                            System.out.println("msg is  "+msg);
                            System.out.println("i is  "+i++);
                           
                           //input.readLine()可以读到空值
                          //  System.out.println("收到的第"+i+"个命令"+msg);  
                           
                            
                            if ("shutdown".equals(msg)) {  
                                shutdown(clientSocket);  
                                System.out.println("shutdown执行");
                                
                                
                            } else if ("reboot".equals(msg)) {  
                                reboot();  
                               
                            } 
                            else if ("cancel".equals(msg)) {  
                                cancel(clientSocket);  
                                System.out.println("cancel执行");
                                
                          //  }  
            			}
            		
            		}
                } catch (Exception e) {  
                } finally {  
                    try {  
                        clientSocket.close();  
                    } catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
        //    }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    // 关机  
    private  static void shutdown( Socket clientSocket) throws IOException {  
      //  Runtime.getRuntime().exec("shutdown -s -t 60");
        Date dNow = new Date();   
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String Datenow = sdf.format(dNow);   
        System.out.println("shutdown ,60 seconds later from"+Datenow); 
    	PrintStream	out=new PrintStream(clientSocket.getOutputStream());
    	out.println("shutdown 已经执行");
    }  
  
    // 重启  
    private static void reboot() throws IOException {  
        Runtime.getRuntime().exec("shutdown -r -t 60");  
        System.out.println("reboot ,60 seconds later ");  
    }  
  
    // 取消关机或重启  
    private static void cancel(Socket clientSocket) throws IOException {  
     //   Runtime.getRuntime().exec("shutdown -a");  
        Date dNow = new Date();   
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String Datenow = sdf.format(dNow);   
        System.out.println("cancel shutdown or restart"+Datenow);  
    	PrintStream	out=new PrintStream(clientSocket.getOutputStream());
    	out.println("cancel 已经执行");
    }  
  
}  

所以在取值的时候应该先判断

while(input.ready()){
            			
                            String msg = input.readLine();  
                            System.out.println("msg is  "+msg);
                            System.out.println("i is  "+i++);
                            ;
                          //  System.out.println("收到的第"+i+"个命令"+msg);  
                           
                            // 判断输入,进行相应的操作  
                            if ("shutdown".equals(msg)) {  
                                shutdown(clientSocket);  
                                System.out.println("shutdown执行");
                                // 发送消息回Android端  
                          
                                
                            } else if ("reboot".equals(msg)) {  
                                reboot();  
                               
                            } 
                            else if ("cancel".equals(msg)) {  
                                cancel(clientSocket);  
                                System.out.println("cancel执行");
                                
                           }  
            			}
            		
客户端部分:

public class client{
	public static void main(String[]args) throws Exception{
		Socket client=null;
		 Thread.sleep(5000);
		client=new Socket("127.0.0.1",30000);
		PrintStream out=null;
		BufferedReader input=null;
		
		out=new PrintStream(client.getOutputStream());
	
	    Thread.sleep(5000);
		String str="shutdown";
		 System.out.println("before write  "+new Date());
		out.println(str);
		 System.out.println("after write  "+new Date());
		System.out.println("发送了shutdown");
	
		String str1="cancel";
		out.println(str1);
		 System.out.println("after write2  "+new Date());
		System.out.println("发送了cancel");
		input=new BufferedReader(new InputStreamReader(client.getInputStream()));
		String msg = input.readLine(); 
		System.out.println(msg);
		String msg1 = input.readLine(); 
		System.out.println(msg1);   
		client.close();
	}
}


你可能感兴趣的:(java)