gpt4 book ai didi

Java Socket - 管道损坏错误

转载 作者:行者123 更新时间:2023-12-01 08:54:44 27 4
gpt4 key购买 nike

我正在尝试通过套接字发送int值、long值、long数组和2d double数组从客户端到服务器。

我成功发送了 int、long 值和 long 数组,但是当涉及到双数组时(output.writeObject(server_ind); - 请参阅下面的客户端代码),我收到以下错误:

错误:

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876)
at java.io.ObjectOutputStream$BlockDataOutputStream.writeByte(ObjectOutputStream.java:1914)
at java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1575)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:350)
at clientSide.ClientSocket.connectionProtocol(ClientSocket.java:36)
at clientSide.clientMain.main(clientMain.java:97)

我的代码如下:

客户端:

        ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());

output.writeObject(num_doc); //int value
output.flush();

output.writeObject(num); //long value
output.flush();

output.writeObject(queryTDs); //long[] array
output.flush();

output.writeObject(server_ind); //double[][]
output.flush();

服务器端:

    input = new ObjectInputStream(clientSocket.getInputStream());

num_doc = input.readInt();
num = input.readLong();
TDs = (long[]) input.readObject();
server_ind = (double[][]) input.readObject();

output = new ObjectOutputStream(clientSocket.getOutputStream());
output.writeObject("Received");

谢谢!

最佳答案

当发送者和接收者之间的连接在发送者完成发送所有流之前被接收者(在本例中为服务器端)关闭时,会发生管道损坏异常

检查你的代码我注意到:

在第一种情况下,您发送的是 32 位 (int) 的对象:


输出.writeObject(num_doc);//整数值
输出.flush();

然后等待 32 位:


num_doc = input.readInt();

与第二种情况相同,当您发送和接收 64 位(long 类型)时

long[] 的情况下,您将发送一个对象,其大小取决于数据的数量和类型,根据 Oracle 文档,对于“ObjectOutputStream:”

Write the specified object to the ObjectOutputStream. The class of the object, the signature of the class, and the values of the non-transient and non-static fields of the class and all of its supertypes are written

但在 double[][] 的情况下,您发送的 (double[]) 中每个元素都有另一个 double[].由于某种原因,我不清楚,ObjectInputStream 无法读取客户端发送的所有对象。

因此,接收方可能不知道需要读取多少字节来构建 double 组。

问你一个问题(@Liutauras94):服务器端是否有异常?

关于Java Socket - 管道损坏错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42115122/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com