【问题标题】:String truncated while transferring from Client to Server - Java从客户端传输到服务器时字符串被截断 - Java
【发布时间】:2015-07-01 13:26:14
【问题描述】:

我正在尝试将客户端系统的详细信息发送到服务器系统,但服务器没有收到任何内容。一旦到达第一行,它就会停止打印。有人帮我解决这个问题。

//服务器

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);
        }

    }

【问题讨论】:

  • 您将s.getOutputStream() 包装在ObjectOutputStream DataOutputStream 中。这让我觉得这是一个非常糟糕的主意。考虑到您从未使用过dOut,这可能不是问题,但这仍然是个坏主意...
  • 而你在循环中这样做,这使得情况变得更糟。在循环顶部只打开这些流一次。
  • 那么正确的方法和解决方案是什么?

标签: java string client server lan


【解决方案1】:

您在同一个ObjectOutputStream 上多次调用writeObject - 但在阅读代码中,您只调用了readObject一次

您需要循环读取代码,例如

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

现在当它到达流的末尾时会抛出异常,我怀疑 - 你可能应该有一些标记值(例如 null)来指示“数据结束”。 (我不认为 ObjectInputStream 只是为你做这个。)

此外,在您的客户端代码中,您正在创建多个 InputStreamReader 对象来包装同一个套接字的 InputStream - 这是一个坏主意。

从根本上说,我认为您需要更仔细地考虑服务器和客户端之间的协议 - 想想服务器如何知道客户端何时完成一组输出,以及何时应该发送下一组输出进程名称等。然后尝试重新设计您的代码,以便您只包装任何特定的流一次(当然,该包装器可以自己包装)。最后,在一个方向使用ObjectInputStream/ObjectOutputStream 似乎很奇怪,而在另一个方向使用纯文本。 IMO,协议应该很少是不对称的。

【讨论】:

  • 它可以工作,也没有异常抛出。 :)
  • 哦,不,当我看到它使用“JTextArea”时,我得到了你想说的问题。摆脱它的方法是什么? @JonSkeet。
  • @question:仔细阅读我的其余答案,并确切地考虑您希望协议是什么样子。然后我真的会从头开始重新开始这些代码——它们现在非常混乱。
  • 是的,它正在急于完成这项工作。我真正想要实现的是向客户端请求客户端系统详细信息,我通过发送一条小消息来请求它,然后有一段代码返回详细信息,并且该详细信息被传递到套接字到服务器端.我已经让一切正常工作,期待“while”循环,即使在传输到服务器所需的数据之后,它也会永远持续下去。当我在“控制台”中显示结果时,它工作正常,但是当我在“JTextArea”中显示时,它显示并快速滚动并永远循环。 @JonSkeet
  • @question:赶时间并不意味着你可以在设计上吝啬。退后一步,来回考虑协议,并适当地设计它。以一种有节制的方式做到这一点会比在这里和那里尝试调整要快得多。
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 2014-08-10
  • 2021-12-20
  • 2018-03-02
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多