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

时间:2013-08-11 08:54:10

标签: 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());

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

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

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

编辑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)

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:0)

套接字是一个全双工管道。它有一个输入流和一个输出流。要拥有多个流,您应该在其上构建一个多路复用协议(TCP)。

答案 2 :(得分:0)

在不知道错误消息的情况下,您的代码会发生什么,您始终会获得相同的输入/输出流,并且在尝试获取ObjectInputStream时应该挂起。 这是因为,由于某种原因,新创建的ObjectInputStream需要与相应的ObjectOutputStream通信并等待它连接。 我总是使用以下代码:

Socket socket = new Socket("localhost", 12345);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.flush();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

通过调用flush,套接字另一端的输入流很开心并继续。

编辑,关于你的Edit2: 这看起来像第二个ObjectOutputStreams将一些元数据写入第一个InputStream读取的流(反之亦然)。该元数据被解释为不一致,并抛出异常。 您应该每个插槽只打开一个输入和输出流,并使用一个ObjectStream覆盖每个输出流。如果你需要更多的流打开更多的套接字。根据您的系统,您可以同时打开几百个(如果您真的需要这个......)