2012-05-11 2 views
0

Я пишу программу сервера/клиента. Клиент отправляет «запрос» (которые являются объектами, предназначенными для этой цели) на сервер, а сервер декодирует их с помощью ObjectInputStream. Все объекты «Запрос» имеют один и тот же класс и просто различаются в полях данных.
Все обычно работает; но в некоторых конкретных состояниях (возможно, когда объект Request немного больше, но не более 200 kb!) readObject() на серверах просто блокирует без исключения.
Любая идея ?!readObject() блокировка для определенных объектов

Серверный код:

public class ConnectionThread extends Thread { 

    Socket con; 
    Request request; 

    public ConnectionThread(Socket s) { 
     con = s; 
     try { 
      ObjectInputStream in = new ObjectInputStream(con.getInputStream()); 
      // Works till here; the object "in" is initialized. 
      request = (Request) in.readObject(); 
      // This line is not reached, in particular cases. 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(ConnectionThread.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(ConnectionThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

... 
} 

Код клиента:

public static void saveStoreDataForTable(DataTable tb) { 
    try { 
     Socket s = new Socket("localhost", portNo); 
     ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
     out.writeObject(new Request("saveStoreData", 
       new Object[] 
       {tb.getEdited(), tb.getRemoved(), tb.getNewTables(), tb.getAlterations()})); 
     out.flush(); 
     // These lines work. But I can't get servers respone; again, in some particular cases. 
... 
} 
+0

Я думаю, что вам нужно здесь, это улов с Исключением, чтобы поймать любые другие исключения, о которых вы не подумали. Я вижу, возможно, in.readObject() может не возвращать объект типа «Запрос»? –

+0

'readObject()' не блокирует определенные объекты '. Он блокируется, когда нет данных для приема. – EJP

ответ

1

Вы должны двигаться, что I/O из конструктора для метода запуска(). В настоящий момент вы делаете ввод-вывод в потоке, который создает этот поток, который почти наверняка является неправильным потоком.

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