我有一个使用对象进行通信的客户端服务器应用程序 当我只从客户端向服务器发送一个对象时,一切运行良好 当我尝试在同一个流上一个接一个地发送几个对象时,我得到了
StreamCorruptedException.
有人可以指导我找出这个错误的原因吗?
客户端写入方法
private SecMessage[] send(SecMessage[] msgs)
{
SecMessage result[]=new SecMessage[msgs.length];
Socket s=null;
ObjectOutputStream objOut =null;
ObjectInputStream objIn=null;
try
{
s=new Socket("localhost",12345);
objOut=new ObjectOutputStream( s.getOutputStream());
for (SecMessage msg : msgs)
{
objOut.writeObject(msg);
}
objOut.flush();
objIn=new ObjectInputStream(s.getInputStream());
for (int i=0;i<result.length;i++)
result[i]=(SecMessage)objIn.readObject();
}
catch(java.io.IOException e)
{
alert(IO_ERROR_MSG+"\n"+e.getMessage());
}
catch (ClassNotFoundException e)
{
alert(INTERNAL_ERROR+"\n"+e.getMessage());
}
finally
{
try {objIn.close();} catch (IOException e) {}
try {objOut.close();} catch (IOException e) {}
}
return result;
}
服务器读取方法
//in is an inputStream Defined in the server
SecMessage rcvdMsgObj;
rcvdMsgObj=(SecMessage)new ObjectInputStream(in).readObject();
return rcvdMsgObj;
和SecMessage类是
public class SecMessage implements java.io.Serializable
{
private static final long serialVersionUID = 3940341617988134707L;
private String cmd;
//... nothing interesting here , just a bunch of fields , getter and setters
}
答案 0 :(得分:10)
如果要发送多个对象,通常最简单的方法是将它们设置为Object[]
或List
之类的持有者/集合。它可以节省您必须明确检查流的结尾,并负责明确传输流中有多少对象。
您的“服务器读取方法”仅读取一个对象。如果多次调用,则会出现错误,因为它尝试从同一输入流打开多个对象流。这不起作用,因为所有对象都写入客户端的相同对象流,因此您必须在服务器端镜像这种安排。也就是说,使用一个对象输入流并从中读取多个对象。
(你得到的错误是因为objectOutputStream写了一个标题,这是objectIutputStream所期望的。由于你没有编写多个流,而只是多个对象,所以在套接字输入上创建的下一个objectInputStream无法找到第二个标题,并抛出异常。)
要修复它,请在接受套接字连接时创建objectInputStream。将此objectInputStream传递给您的服务器读取方法并从中读取Object。
答案 1 :(得分:1)
当我只从客户端向服务器发送一个对象时,一切正常。
当我尝试在同一个流上一个接一个地发送多个对象时,我得到
StreamCorruptedException
。
实际上,您的客户端代码是将一个对象写入服务器,并从服务器读取多个对象。服务器端没有任何东西写客户端试图读取的对象。
答案 2 :(得分:-2)
如果您在一侧使用Socket
而在另一侧使用SSLSocket
,则也可能发生此异常。一致性很重要。