1

I'm trying to create a multiplayer game, who runs on the internet. The problem is that I'm trying to get input on a stream and for some reason I can't make 2 streams with one socket, and I'll explain:

Socket s=new Socket("127.0.0.1",5001);
ObjectInputStream obj1=new ObjectInputStream(s.getInputStream());
ObjectInputStream obj2=new ObjectInputStream(s.getInputStream());

Can someone explain me why this code snippet isn't working?

Edit: Here's another example for code sample that isn't working.

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

Edit 2: thanks very much for answering. I tried to flush the objects, but I keep getting this error:

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)
4

3 回答 3

6

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

如果两个东西(比如你是两个包装器 ObjectInputStreams)同时从底层流中读取,它们都会尝试改变流中的位置,但是谁都不知道对方在做什么。所以从一个读取改变了位置,然后另一个期望流在它离开的地方,但事实并非如此。

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

拥有一个读取传入对象的 ObjectInputStream。如果要将这些对象发布给多个消费者,请创建一个事物集合以将传入对象发送到,然后遍历它们并将新对象传递给每个消费者。

于 2013-08-11T12:29:21.927 回答
0

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

于 2013-08-11T09:47:48.967 回答
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 覆盖每个输出流。如果您需要更多流,请打开更多套接字。根据您的系统,您可以同时打开其中的 100 个(如果您真的需要这个...)

于 2013-08-11T09:48:07.043 回答