Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 爪哇元';在通过套接字流发送对象后,不能对其进行反序列化_Java_Sockets - Fatal编程技术网

Java 爪哇元';在通过套接字流发送对象后,不能对其进行反序列化

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

我正在尝试创建一个应用程序,它将使用套接字通过本地网络发送对象。当我在Intellij Idea中运行服务器和客户机代码时,它们工作正常,但当我在一台电脑上运行服务器代码,在另一台电脑上运行客户机代码时,会出现类似
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个或更多的前字节。然后你可以这样工作:

  • 读取2个(或更多)前字节并检测数据包的大小
  • 为此大小创建缓冲区并读取数据包字节。(确保从套接字读取所有数据包数据。您可以使用
    SocketInputStream.read(byte[])
    方法的返回值来计算它)
  • 将数据包传递到
    ObjectInputStream
    并读取对象
    很可能你还没有完全读懂这个消息,它可能需要多次调用<代码>输入流.Read < /Cord>,在尝试从那个缓冲区读取之前,你必须考虑<代码> Num < /C>,因为它将包含有用数据之后的垃圾。为什么你还要添加那个缓冲区呢?不能直接执行
    new ObjectInputStream(inStream)
    ?为什么不使用BufferedInputStream而不是自己处理缓冲区?我刚刚升级并离开的是其他应用程序中的代码,不管怎样,它工作正常,当我发送从字符串创建的常规字节时,消息会被读取,例如,我试着多次调用它,但仍然是一样的,我可以向服务器发送文件,服务器可以向我发送文件,但只有服务器可以读取文件,而不是我(我是另一台pc上的客户机,服务器在我创建项目的主pc上)嗯,代码被破坏了。您不能像这样从InputStream读取数据。如果它在任何时候阻塞,单个
    read
    调用都不会给出完整的消息。如果所有内容都是本地或内存中的,则可能不会发生这种情况,但通过网络会发生这种情况。如果数据大于单个缓冲区,我也不会工作。