Java套接字-管道断开错误

Java套接字-管道断开错误,java,sockets,serialization,serversocket,Java,Sockets,Serialization,Serversocket,我试图通过套接字将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

我试图通过套接字将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");
我的代码如下:

客户端:

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");
服务器端:

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

谢谢

我建议您将双精度值转换为4字节(64位)的数组,并使用write方法(byte[])而不是writeObject发送它。与接收其他部分的字节顺序相同


另外,在Java中,还有另一种处理数字数据类型的流编写器,它们比尝试发送对象要好。

您正在编写对象,但正在读取原语。因此,最终你读取的数据比实际数据要少,更不用说完全错误的数据了;然后在套接字中仍有未读的挂起数据时关闭套接字;以及导致连接重置被传播到写入器;这导致了“管道破裂”


如果使用
writeObject()
写入数据,则必须使用
readObject()
读取数据。如果使用
writeInt()
写入数据,则必须使用
readInt()
读取数据。以此类推。

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

检查代码时,我注意到:

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


output.writeObject(num_doc)//整数值
output.flush();

并等待32位:


num_doc=input.readInt();

第二种情况也是如此,当您发送和接收64位(
long
type)

long[]
的情况下,您发送的对象的大小取决于数据的数量和类型,根据oracle文档,对象输出流:

将指定的对象写入ObjectOutputStream。写入对象的类、类的签名、类及其所有超类型的非瞬态和非静态字段的值

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

因此,可能是接收器不知道构建双数组需要读取多少字节


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

能否显示有意义的代码?例外情况出现在:clientSide.ClientSocket.connectionProtocol(ClientSocket.java:36)中,但不在上面描述的postAs中-“但是当涉及双数组时(output.writeObject(server_ind);-请参见下面的客户端代码)”,所以output.writeObject(server_ind);这是代码中的第36行,如果不够清楚,请道歉。服务器日志中有什么内容?我假设在第
TDs=(long[])input.readObject()行附近的某个地方你的代码抛出异常。我会在两边加上debiug,你会得到异常的原因。它比所有的键入和格式化以及等待回答更容易、更快。你推荐它为什么?因为通过套接字发送哪些信息更容易进行低级调试,通过数据流,你可以打印和分析发送的字节顺序,您还可以创建一个日志,其中包含接收或发送的十六进制信息格式的原始数据。当您在不同的平台(如Java和.Net)上创建服务器和客户端时,此信息非常有用。这就是我推荐它的原因。因此,所有这些信息都应该出现在你的答案中,而不是必须被询问,但是没有任何东西可以确定OP为什么会出现“管道破裂”错误。这不是一个多平台的问题:这是关于Java序列化的问题。谢谢你的回答,这正是我的问题。我正在发送一个对象,但预期为和int.:)