我已经实现了基于套接字的客户端 - 服务器架构,其中服务器接收来自客户端的请求,进行一些计算并返回结果。 为简单起见,假设客户端向服务器发送请求,服务器执行任务100次,返回这些结果的数组。
我将服务器打包为jar文件,我在客户端内启动了一个新的服务器进程(目的是在某个时候实现并行处理)。但是,迭代过程在第80次迭代时冻结:S。当我停止执行时,服务器继续并完成其任务。
我还尝试使用以下选项运行服务器客户端:
1& 2工作正常,但预定的方式在某些时候停止。
你知道可能是什么问题吗?
更新
当它尝试写入文件时,服务器执行似乎冻结了(在这种情况下是System.err)
Stack trace:
java.io.FileOutputStream.writeBytes(Native Method)
java.io.FileOutputStream.write(FileOutputStream.java:326)
java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
java.io.PrintStream.write(PrintStream.java:482)
sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
java.io.PrintStream.write(PrintStream.java:527)
java.io.PrintStream.print(PrintStream.java:669)
java.io.PrintStream.append(PrintStream.java:1065)
java.io.PrintStream.append(PrintStream.java:57)
java.util.Formatter$FixedString.print(Formatter.java:2595)
java.util.Formatter.format(Formatter.java:2508)
java.io.PrintStream.format(PrintStream.java:970)
java.io.PrintStream.printf(PrintStream.java:871)
更新2
问题:服务器端的缓冲区溢出
解决方案:
A)增加Eclipse输出控制台容量(instructions here)。
B)将System.out或System.err重定向到文件。
C)正如@Eashi所建议:禁用System.err / out(instructions here)。
D)@Peter Lawrey的另一个很好的解决方案,如果你使用ProcessBuilder:通过
将System.out与System.out合并 ProcessBuilder pb = new ProcessBuilder(....);
pb.redirectErrorStream(true);