2015-02-23 3 views
0

Я пытаюсь разработать клиент-серверное соединение между телефоном и ПК с помощью сокетов. Во время разработки я столкнулся с проблемой и не смог ее исправить. Проблема связана с выходным потоком. Я использую ObjectOutputStream отправить массив строк для клиента, и он работает, когда я использую этот код:Проблемы с выходным потоком сокетов и входным потоком

try 
    { 
     // отправка пакета с файлами 
     DataInputStream dir = new DataInputStream(conn.getInputStream()); 
     OutputStream dos = conn.getOutputStream(); 
     ObjectOutputStream objectOutput = new ObjectOutputStream(dos); 
     byte messageType = dir.readByte(); 
     switch(messageType) { 
     case 1: 
      try { 
       textArea.append("\nClient sends a command: " + dir.readUTF()); 
       objectOutput.writeObject(results); 
       objectOutput.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     }    
     dir.close(); 
    } catch (IOException e) { 
     ...... 

, но когда я перехожу ObjectOutputStream к переключателю:

try 
    { 
     // отправка пакета с файлами 
     DataInputStream dir = new DataInputStream(conn.getInputStream()); 
     OutputStream dos = conn.getOutputStream(); 
     byte messageType = dir.readByte(); 
     switch(messageType) { 
     case 1: 
      try { 
       ObjectOutputStream objectOutput = new ObjectOutputStream(dos); 
       textArea.append("\nClient sends a command: " + dir.readUTF()); 
       objectOutput.writeObject(results); 
       objectOutput.close(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     }    
     dir.close(); 
    } catch (IOException e) { 
     .... 

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

ответ

1

Я решил проблему. Я просто использую BufferedReader & Writer для него, потому что он также будет использоваться для передачи файлов. Так что теперь код работает отлично и выглядит следующим образом:

// отправка пакета с файлами 
      BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), ENCODING)); 
      String messageType = br.readLine(); 
      switch(messageType) { 
      case "connect": { 
       List<String> results = new ArrayList<String>(); 

       File[] files = new File("C:/Tenzor_Denis/ServerFiles/").listFiles(); 
       //If this pathname does not denote a directory, then listFiles() returns null. 

       for (File file : files) { 
        if (file.toString().endsWith(".txt")) { 
         results.add(file.getName()); 
        } 
       } 

       try { 
        for(int i = 0; i < results.size(); i++) { 
         bw.write(results.get(i)); 
         bw.newLine(); 
         //textArea.append(" " + results.get(i)); 
        } 
        textArea.append("\nClient sends a command: " + messageType); 

       } catch(Exception e) { 
        e.printStackTrace(); 
       } 
       bw.close(); 
       br.close(); 
      } 
      break; 
      } 
     } 

Thx всем за ответы.

0

В какой строке он замерзает? Кажется, что чтение из входного потока заставляет выходной поток блокироваться до тех пор, пока все не будет потреблено. Посмотрите документацию для вашего объекта conn. Что это за класс? Возможно, перемещение вызова dir.readUTF() перед созданием ObjectOutputStream может решить проблему.

0

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

Но ваш код не имеет смысла. Вы пишете с ObjectOutputStream,, но все, что вы читаете от сверстника, - это один байт. Если вы пишете объекты, вам нужно читать объекты, с ObjectInputStream, не DataInputStream,, и при использовании обоих входных и выходных потоков объектов вы всегда должны строить ObjectOutputStream, с обоих концов, чтобы быть в безопасности.

+0

Мне нужно написать сервер, который мог бы отправлять, получать файлы и получать список файлов. Из-за этого я думаю, что я мог бы использовать «переключатель» для различных команд. Но теперь я вижу, что мне нужно инициализировать ввод и вывод перед коммутатором, и это проблема. Теперь я застрял –

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