Строка, усеченная при передаче с клиента на сервер - 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 ответ

Ты звонишь writeObject несколько раз на одном ObjectOutputStream - но в коде чтения, вы только звоните readObject один раз

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

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

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

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

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

Другие вопросы по тегам