Java套接字-管道断开错误
我试图通过套接字将int值、long值、long数组和2d double数组从客户端发送到服务器 我成功地发送了int、long值和long数组,但是当涉及到双数组(output.writeObject(server_ind);-请参阅下面的客户端代码)时,我收到以下错误: 错误: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
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.:)