2013-04-22 6 views
0

То, что я пытаюсь достичь, заключается в том, что с моей программой пользователь может загружать файл столько раз, сколько захочет, а когда они нажимают кнопку закрытия, то я хочу закрыть или прекратите соединение сокета, но когда я снова запустил GUI, соединение все еще там, хотя я еще не запустил его.Сохраняйте SocketServer до тех пор, пока рамка не будет закрыта.

while (true) { // >>>>>>>HERE IS MY PROBLEM<<<<<<< 
    try{ 
    connectionSocket = welcomeSocket.accept(); 

    inFromClient = new BufferedReader(new InputStreamReader(
      connectionSocket.getInputStream())); 

    outToClient = new DataOutputStream(
      connectionSocket.getOutputStream()); 

       //Do something here..... 
    }catch(IOException e){ } 
} 

Так что, если я держу некоторое время (истина), то соединение будет остаться в живых, но несмотря на то, когда я закрыл раму уже ее еще подключения.

Я метод @Override для окна закрыты здесь

frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent b) { 


      if(socket != null){ 
      try { 
       socket = new Socket(hostIP, port); 
      } catch (UnknownHostException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 


      } 
      try { 
       if (socket != null) { 
       socket.close(); 
       socket = null; 
       } 
       } 
      catch (IOException e) { socket = null; } 


      ftoc.dispose(); 

     } 

    }); 
+0

Возможный дубликат [Как сохранить розетку до тех пор, пока окно не будет закрыто Java] (h ttp: //stackoverflow.com/questions/16124899/how-to-keep-the-socket-alive-until-the-window-is-close-java) – fglez

ответ

1

У вас есть несколько вариантов ...

создать «бежать» флаг в цикле сокета, который может быть активирован (ложь например) извне. Добавьте WindowListener к раме и на windowClosing переверните флаг и прервите поток. Это позволит завершить цикл.

Вы также можете попробовать настроить серверный сокет в потоке демона, но я подозреваю, что это не сработает, так как операция блокировки серверного сокета, вероятно, не волнует.

Обновлен например

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestSocket { 

    private SocketThread socketThread; 

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

    public TestSocket() { 
     socketThread = new SocketThread(); 
     socketThread.start(); 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       frame.add(new JLabel("Close me if you dare")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       frame.addWindowListener(new WindowAdapter() { 
        @Override 
        public void windowClosing(WindowEvent e) { 
         socketThread.stopThatSocket(); 
        } 
       }); 
      } 
     }); 
    } 

    public class SocketThread extends Thread { 

     private volatile boolean flagToSetWhenYouWantToStop = true; 
     private ServerSocket socket = null; 

     public SocketThread() { 
      setName("Socket"); 
      setDaemon(true); 
     } 

     public void stopThatSocket() { 
      flagToSetWhenYouWantToStop = false; 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException ex) { 
       } 
      } 
      interrupt(); 
      try { 
       join(); 
      } catch (InterruptedException ex) { 
      } 
     } 

     @Override 
     public void run() { 

      try { 
       socket = new ServerSocket(1234); 
       while (flagToSetWhenYouWantToStop) { 
        Socket accept = socket.accept(); 
       } 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 
    } 
} 

Обновленного с командой, например простой розеткой

В этом примере основных сообщаетсов через сокет, чтобы сообщить серверу он должен закрыть ...

import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.net.SocketFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestSocket { 

    private SocketThread socketThread; 

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

    public TestSocket() { 
     socketThread = new SocketThread(); 
     socketThread.start(); 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new GridBagLayout()); 
       frame.add(new JLabel("Close me if you dare")); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 

       frame.addWindowListener(new WindowAdapter() { 
        @Override 
        public void windowClosing(WindowEvent e) { 
//      socketThread.stopThatSocket(); 
         Socket socket = null; 

         try { 
          socket = SocketFactory.getDefault().createSocket("localhost", 1234); 

          BufferedWriter bw = null; 
          try { 
           bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
           System.out.println("Out-Cmd = STOP"); 
           bw.write("stop"); 
           bw.newLine(); 
          } finally { 
           try { 
            bw.close(); 
           } catch (Exception exp) { 
           } 
          } 
         } catch (IOException ex) { 
          ex.printStackTrace(); 
         } finally { 
          try { 
           socket.close(); 
          } catch (Exception exp) { 
          } 
         } 
        } 
       }); 
      } 
     }); 
    } 

    public class SocketThread extends Thread { 

     private volatile boolean flagToSetWhenYouWantToStop = true; 
     private ServerSocket socket = null; 

     public SocketThread() { 
      setName("Socket"); 
      setDaemon(true); 
     } 

     public void stopThatSocket() { 
      flagToSetWhenYouWantToStop = false; 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException ex) { 
       } 
      } 
      interrupt(); 
      try { 
       join(); 
      } catch (InterruptedException ex) { 
      } 
     } 

     @Override 
     public void run() { 

      try { 
       socket = new ServerSocket(1234); 
       while (flagToSetWhenYouWantToStop) { 
        Socket accept = socket.accept(); 
        /** 
        * Normally I would have a command processor take care of this, 
        * read in the command and then terminate the server thread by 
        * calling stopThatSocket... 
        */ 
        BufferedReader br = null; 
        try { 
         br = new BufferedReader(new InputStreamReader(accept.getInputStream())); 
         String cmd = br.readLine(); 
         System.out.println("In-Cmd = " + cmd); 
         if (cmd.equalsIgnoreCase("stop")) { 
          stopThatSocket(); 
         } 
        } finally { 
         try { 
          br.close(); 
         } catch (Exception e) { 
         } 
        } 
       } 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 
    } 
} 
+0

Я очень новичок в Java и действительно не очень много информации об этом. Это два файла, которые я использую, и как я могу отправить что-то для запуска цикла while? – Ali

+0

@ Али Серьезно? Вы новичок в Java, и вы уже играете с сокетами, не зная, как выйти из простого 'while-loop'. Очки за попытку новых вещей, но, возможно, вам нужно сначала понять основные принципы ... IMHO – MadProgrammer

+0

Нет, я имел в виду, что я не знаю, как отправить логическое значение из Клиента на Сервер, чтобы вызвать это петля. Мне жаль, что я не прояснил свое заявление. – Ali

Смежные вопросы