2012-10-22 52 views
0

我有這段代碼,如果它與服務器窗口斷開連接,我需要在標籤中顯示「斷開連接」。我的問題是,我不知道如何檢測是否斷開連接。我想要檢測連接狀態,即使沒有連接或從另一端沒有觸發。如何知道遠程服務器是否與遠程控制斷開連接Java代碼

// Copyright 2012 
// Android Remote Desktop Server Ver. 1.0 


import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.net.*; 
import java.util.Random; 

public class ServerWindow implements ActionListener{ 

    private RemoteDataServer server; 



    private Thread sThread; //server thread 

    private static final int WINDOW_HEIGHT = 200; 
    private static final int WINDOW_WIDTH = 350; 

    private String ipAddress; 

    private JFrame window = new JFrame("Remote Control for Android"); 

    private JLabel addressLabel = new JLabel(""); 
    private JLabel portLabel = new JLabel("Android Remote Control Port: "); 
    private JTextArea[] buffers = new JTextArea[3]; 
    private JTextField portTxt = new JTextField(5); 
    private JLabel serverMessages = new JLabel("Not Connected"); 

    private JButton connectButton = new JButton("Start Server"); 
    private JButton disconnectButton = new JButton("Stop Server"); 

    public boolean connected = false; 

    public ServerWindow(){ 
     server = new RemoteDataServer(); 

     window.setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     connectButton.addActionListener(this); 
     disconnectButton.addActionListener(this); 

     Container c = window.getContentPane(); 
     c.setLayout(new FlowLayout()); 

     try{ 
      InetAddress ip = InetAddress.getLocalHost(); 
      ipAddress = ip.getHostAddress(); 
      addressLabel.setText("Android Remote Control Server IP Address: "+ipAddress); 
     } 
     catch(Exception e){addressLabel.setText("IP Address Could Not be Resolved");} 

     int x; 
     for(x = 0; x < 3; x++){ 
      buffers[x] = new JTextArea("", 1, 30); 
      buffers[x].setEditable(false); 
      buffers[x].setBackground(window.getBackground()); 
     } 

     portTxt.setEditable(false); 
     Random portRandom = new Random(); 
     for (int i = 0; i < 10; i++) { 

      int port = portRandom.nextInt(4998) + 1; 
      int portNum = 5000+port; 
      String portString = Integer.toString(portNum); 
      portTxt.setText(portString); 
      } 

     c.add(addressLabel); 
     c.add(buffers[0]); 
     c.add(portLabel); 
     //portTxt.setText("5444"); 
     c.add(portTxt); 
     c.add(buffers[1]); 
     c.add(connectButton); 
     c.add(disconnectButton); 
     c.add(buffers[2]); 
     c.add(serverMessages); 

     window.setLocationRelativeTo(null); 
     window.setVisible(true); 
     window.setResizable(false); 

    } 

    public void actionPerformed(ActionEvent e){ 
     Object src = e.getSource(); 

     if(src instanceof JButton){ 
      if((JButton)src == connectButton){ 
       int port = Integer.parseInt(portTxt.getText()); 
       runServer(port); 
      } 

      else if((JButton)src == disconnectButton){ 
       closeServer(); 
      } 
     } 
    } 

    public void runServer(int port){ 
     if(port <= 9999){ 
      server.setPort(port); 
      sThread = new Thread(server); 
      sThread.start(); 
     } 
     else{ 
      serverMessages.setText("The port Number must be less than 10000"); 
     } 
    } 

    public void closeServer(){ 
     serverMessages.setText("Disconnected"); 
     server.shutdown(); 
     connectButton.setEnabled(true); 
    } 

    public static void main(String[] args){ 
     new ServerWindow(); 
    } 

    public class RemoteDataServer implements Runnable{ 
     int PORT; 
     private DatagramSocket server; 
     private byte[] buf; 
     private DatagramPacket dgp; 

     private String message; 
     private AutoBot bot; 


     public RemoteDataServer(int port){ 
      PORT = port; 
      buf = new byte[1000]; 
      dgp = new DatagramPacket(buf, buf.length); 
      bot = new AutoBot(); 
      serverMessages.setText("Not Connected"); 
     } 

     public RemoteDataServer(){ 
      buf = new byte[1000]; 
      dgp = new DatagramPacket(buf, buf.length); 
      bot = new AutoBot(); 
      serverMessages.setText("Not Connected"); 
     } 

     public String getIpAddress(){ 
      String returnStr; 
      try{ 
        InetAddress ip = InetAddress.getLocalHost(); 
        returnStr = ip.getCanonicalHostName(); 
      } 
      catch(Exception e){ returnStr = new String("Could Not be Resolve Ip Address");} 
      return returnStr; 
     } 

     public void setPort(int port){ 
      PORT = port; 
     } 

     public void shutdown(){ 
      try{server.close(); 
       serverMessages.setText("Disconnected");} 
      catch(Exception e){} 
     } 
     public void run(){ 
      //boolean connected = false; 
      try {InetAddress ip = InetAddress.getLocalHost(); 
       serverMessages.setText("Waiting for connection on " + ip.getCanonicalHostName()); 

       server = new DatagramSocket(PORT, ip); 

       connected = true; 
       connectButton.setEnabled(false); 
      } 
      catch(BindException e){ serverMessages.setText("Port "+PORT+" is already in use. Use a different Port"); } 
      catch(Exception e){serverMessages.setText("Unable to connect");} 

      while(connected){ 
       //Runtime.getRuntime().exit(0); 
       // get message from sender 
       try{ server.receive(dgp); 

        // translate and use the message to automate the desktop 
        message = new String(dgp.getData(), 0, dgp.getLength()); 
        if (message.equals("Connectivity")){ 
         //send response to confirm connectivity 
         serverMessages.setText("Trying to Connect"); 
         server.send(dgp); //echo the message back 
        }else if(message.equals("Connected")){ 
         server.send(dgp); //echo the message back 
        }else if(message.equals("Close")){ 
         serverMessages.setText("Controller has Disconnected. Trying to reconnect."); //echo the message back 
        }else{ 
         serverMessages.setText("Android Phone Connected to ARD Server"); 
         bot.handleMessage(message); 
         server.receive(dgp); 

        } 
       }catch(Exception e){ 
        serverMessages.setText("Disconnected"); 
        connected = false;} 
      } 

     } 

    } 
    } 

回答

1

由於您使用UDP有2個節點之間沒有「真正」的連接,你可能需要進行某種形式從客戶端週期的保活請求。 如果沒有收到響應,那就意味着你斷開連接。

+0

你可以給一些代碼或者一個例子,因爲我是Android編程的初學者。謝謝 –

相關問題