使用一个套接字创建2个流

use*_*468 1 java sockets stream

我正在尝试创建一个在互联网上运行的多人游戏.问题是我正在尝试在流上获取输入,并且由于某种原因我无法使用一个套接字创建2个流,我将解释:

Socket s=new Socket("127.0.0.1",5001);
ObjectInputStream obj1=new ObjectInputStream(s.getInputStream());
ObjectInputStream obj2=new ObjectInputStream(s.getInputStream());
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么这段代码片段不起作用?

编辑:这是代码示例无法正常工作的另一个示例.

while (true) {
    try {
        objI = new ObjectInputStream(sock.getInputStream());
        objO = new ObjectOutputStream(sock.getOutputStream());
     }catch(Exception e) {
        e.printStackTrace();
     }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:非常感谢您的回答.我试图刷新对象,但我不断收到此错误:

java.io.StreamCorruptedException: invalid stream header: 33740003
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Proccess.run(Proccess.java:22)
at java.lang.Thread.run(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

Tim*_*eau 6

流是有状态的 - 当您从流中读取时,您正在从流中的某个位置读取,并通过这样做来更改位置.

如果两个东西(比如你是两个包装器ObjectInputStream)同时从底层流中读取,它们都会尝试改变流中的位置,但是没有人知道对方在做什么.因此,从一个人那里读取会改变位置,然后另一个人希望流能够离开它,但事实并非如此.

想象一下,你把这个答案写成了单独写在纸上的文字,一个接一个地给你.但是当你正在阅读那些纸张时,其他人在你看到它们之前将它们中的一些带走了 - 你得到的东西没有意义.这就是正在发生的事情 - 一个流取走部分数据,当另一个流再次查看数据时,其中一些流丢失,由另一个流消耗.

一个 ObjectInputStream可以读取传入的对象.如果要将这些对象发布到多个使用者,请创建一组事物以将传入的对象发送到,并迭代它们并将新对象传递给每个对象.