Java 爪哇元';在通过套接字流发送对象后,不能对其进行反序列化
我正在尝试创建一个应用程序,它将使用套接字通过本地网络发送对象。当我在Intellij Idea中运行服务器和客户机代码时,它们工作正常,但当我在一台电脑上运行服务器代码,在另一台电脑上运行客户机代码时,会出现类似Java 爪哇元';在通过套接字流发送对象后,不能对其进行反序列化,java,sockets,Java,Sockets,我正在尝试创建一个应用程序,它将使用套接字通过本地网络发送对象。当我在Intellij Idea中运行服务器和客户机代码时,它们工作正常,但当我在一台电脑上运行服务器代码,在另一台电脑上运行客户机代码时,会出现类似java.io.StreamCorruptedException:invalid type code:00或java.io.StreamCorruptedException:invalid stream header:6C69656E byte[] readBuffer = new b
java.io.StreamCorruptedException:invalid type code:00
或java.io.StreamCorruptedException:invalid stream header:6C69656E
byte[] readBuffer = new byte[4096];
int num = inStream.read(readBuffer); //inStream is socket input stream
ByteArrayInputStream bis = new ByteArrayInputStream(readBuffer);
ObjectInput in = new ObjectInputStream(bis);
Object o = in.readObject(); //this line throws error
问题是,将对象写入和读取到套接字流在服务器上(在我创建项目的pc上)起作用,但从客户端(我复制项目的另一台pc上)的输入流读取会出错。
有人能帮我吗?我到处寻找解决方案,但我不知道序列化有什么问题,因为它在同一台电脑上工作,但在另一台电脑上不会。有什么方法可以让这台电脑独立吗?当我创建jar文件并在Intellij Idea中工作的同一台pc上运行它时,也会发生这种情况。因为客户端没有完全读取消息 但真正的错误是,您使用的是TCP套接字,就像消息协议传输一样,但TCP是流协议,因此您必须在TCP之上创建自己的消息协议 为什么它在本地系统上运行良好? 因为在本地测试中,客户端和服务器之间的传输数据发生得太快,可能只在一个帧中,所以所有消息都只在一个IO调用中传输,但在internet或网络中,它并不像您所想的那样工作 有两种方法可以处理此错误: 1-将
SocketInputStream
直接传递到ObjectInputStream
实例,并让它处理读取对象
2-创建一个消息协议,例如,您可以将消息的大小设置为2个或更多的前字节。然后你可以这样工作:
SocketInputStream.read(byte[])
方法的返回值来计算它)ObjectInputStream
并读取对象李>
很可能你还没有完全读懂这个消息,它可能需要多次调用<代码>输入流.Read < /Cord>,在尝试从那个缓冲区读取之前,你必须考虑<代码> Num < /C>,因为它将包含有用数据之后的垃圾。为什么你还要添加那个缓冲区呢?不能直接执行
new ObjectInputStream(inStream)
?为什么不使用BufferedInputStream而不是自己处理缓冲区?我刚刚升级并离开的是其他应用程序中的代码,不管怎样,它工作正常,当我发送从字符串创建的常规字节时,消息会被读取,例如,我试着多次调用它,但仍然是一样的,我可以向服务器发送文件,服务器可以向我发送文件,但只有服务器可以读取文件,而不是我(我是另一台pc上的客户机,服务器在我创建项目的主pc上)嗯,代码被破坏了。您不能像这样从InputStream读取数据。如果它在任何时候阻塞,单个read
调用都不会给出完整的消息。如果所有内容都是本地或内存中的,则可能不会发生这种情况,但通过网络会发生这种情况。如果数据大于单个缓冲区,我也不会工作。