2013-05-09 3 views
0

У меня есть сервер-клиентская программа, но я хочу иметь возможность запрашивать данные запроса клиента с сервера для отправки. В прокомментированном коде, если у меня есть это, Sender.send отправляет только один раз, чем ничего не происходит после. Но если я отключу его, все будет хорошо. Не уверен, что я делаю неправильно в прокомментированном коде.Ядро Java замораживается

private class Client extends Thread { 

    private Socket socket; 
    private boolean running; 

    public Client(Socket socket) { 
     this.socket = socket; 
     this.running = true; 
     if (!(clients.contains(socket))) { 
      clients.add(socket.getInetAddress().toString()); 
     } 
    } 

    private void delete() { 
     running = false; 
     try { 
      log("Client disconnected: (" + socket.getInetAddress().toString().replace("/", "") + ":" + socket.getPort() + ")"); 
      clients.remove(socket.getInetAddress().toString()); 
      socket.close(); 
      } catch (IOException e) { 
     } 
     try { 
      interrupt(); 
      join(); 
      } catch (Exception e) { 
     } 
    } 

    public void run() { 
     log("Client connected: (" + socket.getInetAddress().toString().replace("/", "") + ":" + socket.getPort() + ")"); 
     try { 
      ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 
      ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 
      while (running) { 
       if (!Sender.send(oos)) { 
        delete(); 
        return; 
       } 

       try { 
        Object object = ois.readObject(); 

        if (object instanceof String[] && ((String[]) object)[0].equals("COMMAND_REQUEST")) { 
         String command = ((String[]) object)[1].trim(); 
         log("Executed command request: " + command); 
         Sender.log("Executed command request: " + command); 
         Bukkit.getServer().dispatchCommand(getServer().getConsoleSender(), command); 
        } 

        } catch (Exception e) { 
       } 

       Thread.sleep(300); 
      } 
     } catch (Exception e) { 
      delete(); 
     } finally { 
      try { 
       socket.close(); 
       } catch (Exception e) { 
      } 
     } 
    } 

} 

Отправить метод:

protected static boolean send(ObjectOutputStream oos) { 
    try { 
     update(); 
     oos.writeObject(data); 
     oos.flush(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 
+0

Не видя определения 'Sender',' Sender.send() 'и' delete() ', вам будет очень сложно помочь вам. –

+0

Извините, добавлен sender.send. – CBennett

ответ

1

Он работает все нормально

Нет это не имеет. Этот код, который был отправлен, будет в конечном итоге заторможен, когда оба сокета и буфера заполнить.

Прокомментированный код не может работать, если весь код не будет изменен, чтобы использовать один объект ObjectInputStream и ObjectOutputStream для срока службы сокета.

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

+0

Итак, я должен определить 2 потока объектов при вызове конструктора? – CBennett

+2

На самом деле нет, вы должны создать их в методе 'run()', но перед циклом. И сначала вы должны создать 'ObjectOutputStream', прежде чем' ObjectInputStream'. – EJP

+0

Объяснение, почему ObjectOutputStream должно быть создано первым, - это [здесь] (http://frequal.com/java/OpenObjectOutputStreamFirst.html) – BevynQ

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