2015-04-23 4 views
2

Я пытаюсь отправить деталь клиентской системы серверной системе, но сервер не получает ничего. Он прекращает печать после достижения первой строки. кто-то поможет мне преодолеть эту проблему.Строка, усеченная при передаче от клиента к серверу - Java

// Сервер

void connect_clients() throws ClassNotFoundException, InterruptedException 
    { 
     try { 
      ServerSocket listener = new ServerSocket(7700); 
      jButton1.setText("Server Running!"); 
      jButton1.setEnabled(false); 
      ObjectInputStream ois; // = new ObjectInputStream(socket.getInputStream()); 
      while (true) { 

        socket = listener.accept(); 
        socketList.add(socket); 


        ois = new ObjectInputStream(socket.getInputStream()); 
        String message = (String) ois.readObject(); 
        System.out.println("Message Received: " + message); */*/*this is not printing everything 

       } 

      } 
     catch(IOException ex) 
     { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
    } 

// Клиент

void connect_server() throws IOException 
    { 
     try { 
      // TODO code application logic here 
      String serverAddress = JOptionPane.showInputDialog(
        "Enter IP Address of a machine that is\n" + 
          "running the date service on port 9090:"); 
      s = new Socket(serverAddress, 7700); 
      ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); 
      ObjectInputStream ois = null; 
      BufferedReader input; 
      String answer; 
      while(true){ 

       input = 
       new BufferedReader(new InputStreamReader(s.getInputStream())); 

       DataOutputStream dOut = new DataOutputStream(s.getOutputStream()); 


       answer = input.readLine(); 
       System.out.println(answer); 
       if(answer != null) 
       { 
         oos.reset(); 
         String line = ""; 
         String command = "powershell.exe Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | \n" + 
      "Format-Table –AutoSize"; 
           // Executing the command 
         Process powerShellProcess = Runtime.getRuntime().exec(command); 
           // Getting the results 
         powerShellProcess.getOutputStream().close(); 

         System.out.println("Standard Output:"); 
         BufferedReader stdout = new BufferedReader(new InputStreamReader(
         powerShellProcess.getInputStream())); 
         while ((line = stdout.readLine()) != null) { 
         byte[] mybytearray = new byte[(int) line.length()]; 
         oos.writeObject(mybytearray); 

        } 

         stdout.close(); 
         System.out.println("Standard Error:"); 
         BufferedReader stderr = new BufferedReader(new InputStreamReader(
         powerShellProcess.getErrorStream())); 
         while ((line = stderr.readLine()) != null) { 

          oos.writeObject(line); 
          System.out.println("fdg"+line); 
         //printing the output to a file --start 
           try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)))) { 
           out.println(line); 
         } 
         catch (IOException e) 
         { 
          JOptionPane.showMessageDialog(null, e); 
         } 

        } 
         stderr.close(); 
         System.out.println("Done"); 
       } 
      } 
      } 

     catch (ConnectException e) { 

      JOptionPane.showMessageDialog(null, e); 
     } 
     catch (SocketException e) { 

      JOptionPane.showMessageDialog(null, e); 
     } 

    } 
+1

Вы обертываете 's.getOutputStream()' как в 'ObjectOutputStream' *, так и в' DataOutputStream'. Это кажется мне очень плохой идеей. Вероятно, это не проблема, учитывая, что вы никогда не используете 'dOut', но это все еще плохая идея ... –

+0

И вы делаете это в цикле, что делает его еще хуже. Откройте эти потоки только один раз поверх цикла. – Thilo

+0

Итак, каков правильный способ и решение для этого? – question

ответ

1

Вы звоните writeObject несколько раз на том же ObjectOutputStream - но в чтение кода, вы только вызов readObjectодин раз.

Вам нужно будет закодировать код чтения, например.

while (true) { 
    String message = (String) ois.readObject(); 
    System.out.println("Message Received: " + message); 
} 

Теперь, когда будет сгенерировано исключение, когда он достигает конца потока, я подозреваю, - вероятно, вы должны иметь какое-то значение дозорный (например, нулевой), чтобы указать «конец данных». (Я не думаю, что ObjectInputStream просто делает это для вас.)

Кроме того, в коде клиента, вы создаете множественные InputStreamReader объектов оберточное то же сокет InputStream - это плохая идея.

По сути, я думаю, вам нужно более тщательно подумать о протоколе между сервером и клиентом - подумайте о том, как сервер должен знать, когда клиент завершен с одним набором выходных данных, и когда он должен отправить следующее имя процесса и т. д. Затем попробуйте перепроектировать ваш код, чтобы вы только когда-либо обматывали какой-либо конкретный поток один раз (хотя, конечно, эту оболочку можно обернуть самостоятельно). Наконец, кажется странным использовать ObjectInputStream/ObjectOutputStream в одном направлении, но просто текст в другом направлении. Протоколы редко должны быть асимметричными до такой степени, ИМО.

+0

Он работает и не существует никакого исключения. :) – question

+0

О нет, когда я вижу это с помощью «JTextArea», я получаю проблему, которую вы пытались сказать. Каков способ выйти из этого? @JonSkeet. – question

+0

@question: Внимательно прочитайте остальную часть моего ответа и подумайте о * точно, что вы хотите, чтобы протокол выглядел. Тогда я бы действительно начал эти кусочки кода с нуля - они очень грязные на данный момент. –