2015-12-18 6 views
0

Я совершенно новый в java.Сервер завершается из бесконечного цикла while?

Я начал изучать программирование сети Java.

Моя проблема: я оставил свой сервер в бесконечном цикле, чтобы продолжить работу.

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

мой код клиента:

private void check_ordersActionPerformed(java.awt.event.ActionEvent evt) {            
    try { 
     Socket ss = new Socket("localhost", 4000); 
     PrintStream pr = new PrintStream(ss.getOutputStream()); 
     pr.println("Supplier Orders"); 
     pr.println(Supplier.username); 
     pr.close(); 
     this.dispose(); 

    } catch (IOException ex) { 
     Logger.getLogger(supp_page.class.getName()).log(Level.SEVERE, null, ex); 
    } 

мой код сервера:

int iiiiii = 0; 
    ServerSocket s1 = new ServerSocket(4000); 
    String request = null; 
    while(iiiiii == 0) 
    { 
     Socket ss = s1.accept(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(ss.getInputStream())); 
     request = in.readLine(); 

     switch (request) { 
      case "Supplier Orders": 
       Supplier.username = in.readLine(); 
       orders rs = new orders(); 
       rs.setLocation(350, 250); 
       rs.setSize(800, 350); 
       rs.setVisible(true); 
       rs.setTitle("Orders Table"); 
       rs.setResizable(false); 
       break; 

       // some other messages here but iam focus on above one 
     } 
    } 

позвольте мне объяснить еще: когда я называю этот метод его послать сообщение клиенту «Поставщиком Заказы» и имя пользователя .... когда сервер получает это сообщение, он должен запустить страницу gui, содержащую некоторые данные этого поставщика, который дал имя пользователя серверу.

, но когда я закрываю клиент, сервер также завершается ... этого не должно быть. Я хочу, чтобы сервер продолжал работать, а не вышел.

так как это исправить? .. извините за длинный post.

Редактировать

Код для графического интерфейса страницы, он должен показать некоторые данные по таблице: она успешно показали данные, но, как я уже, когда я закрываю клиент, сервер также закрыт, который я не хочу, чтобы это произошло , я хочу сервер продолжать работать не близко

public class orders extends javax.swing.JFrame { 

DefaultTableModel t = new DefaultTableModel(); 
public orders() throws IOException, ClassNotFoundException { 
    initComponents(); 
    request.setModel(t); 
    t.addColumn("ID"); 
    t.addColumn("PRODUCT Name"); 
    t.addColumn("PRODUCT TYPE"); 
    t.addColumn("PRODUCT QUANTITY"); 
    t.addColumn("SUPPLIER ID"); 
    t.addColumn("SUPPLIER NAME"); 
    t.addColumn("SUPPLIER COMPANY"); 
    t.addColumn("SUPPLIER ADDRESS"); 
    t.addColumn("SUPPLIER PHONE NUMBER"); 
    ObjectInputStream oin = new ObjectInputStream(new FileInputStream("Orders.bin")); 
    ArrayList<Order> a = (ArrayList)oin.readObject(); 
    Iterator<Order> iter = a.iterator(); 
    oin.close(); 
    while(iter.hasNext()) 
    { 
     Order r = iter.next(); 
     if(Supplier.username.equals(r.getP().getS().getId() + r.getP().getS().getCompany()) && r.getStatus().equals("PENDING")) 
     { 
      t.addRow(new Object[]{r.getP().getId(),r.getP().getName(),r.getP().getType(),r.getP().getQuantity(),r.getP().getS().getId() 
      ,r.getP().getS().getName(), r.getP().getS().getCompany(), r.getP().getS().getAddress(), r.getP().getS().getPhone_no()}); 
     } 
    } 
} 
} 
+2

Пара вещей выделяется, но мне нужно знать ваше желаемое поведение. Вы хотите только обрабатывать одного клиента одновременно или одновременно обслуживать несколько клиентов? Когда клиент останавливается, 'in.readLine()' генерирует исключение, которое я не вижу в вашей работе, поэтому это, скорее всего, означает, что программа останавливается. Кроме того, вы должны отделить приемное гнездо от его обслуживания. – DBug

+0

моя программа работает на localhost, поэтому, возможно, для обработки только одного клиента. но причина в том, что сервер закрывается ... У меня есть другие сообщения на том же сервере, как это, и он отлично работает ... сервер не выходит, даже если я закрываю клиента. но я не знаю, почему сервер закрывает это сообщение. – PJA

+0

Любая помощь пожалуйста ... мой вопрос неразрешимый ???? – PJA

ответ

1

вопрос заключается в том, что ваш клиент закрывает сокет между клиентом и сервером, когда клиент выходит как DBUG сказал. Поскольку вы блокируете in.readline() на сервере, генерируется исключение IOException (закрытое исключение Socket). Ваш код не обрабатывает IOException, и ваш цикл while будет недостаточным для предотвращения выхода из кода сервера. Вам нужно добавить несколько попыток/уловов, чтобы поймать эти исключения.

Рассмотрите возможность добавления нескольких блоков finally, чтобы гарантировать, что ваши сокеты и потоки будут закрыты должным образом.

+0

Это было действительно полезно сэр и +1 к вашему ответу ... но мне все равно нужна ваша помощь, если вы можете ... я добавил «finally» блоки и автоматически открыл закрывающие сокеты, и мой вопрос: как предотвратить это? ? – PJA

+0

Самый простой шаблон - открыть сокет, затем ввести цикл while во время обслуживания сокета. Если вы хотите продолжить повторную попытку соединения, тогда завершите весь этот код с помощью другого цикла while для повторного подключения. В то время как вы хотите подключиться, подключитесь к сокету, в то время как разъем открыт, служебный разъем. – umhelp

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