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

标签 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)

最佳答案

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

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

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

一个 ObjectInputStream 来读取传入的对象。如果您想将这些对象发布给多个消费者,请创建一个事物集合以将传入的对象发送到,并迭代它们并将新对象传递给每个消费者。

关于java - 使用一个套接字创建 2 个流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18170275/

相关文章:

php - 使用 Server-Sent 事件广播消息

javascript - Node.js - 找到值后读取流,然后关闭

firebase - Stream/Bloc/Repository/Firebase 数据流 Flutter

java - 如何在一段时间后打开另一个窗口?

java - JSON 响应在 PHP 版本 5.3.24 中不起作用

java - Android Studio : Plugin with id 'com.android.application' not found

c - 有可用的 mbed 以太网接口(interface)库吗?

java - 如何在 android java 中发出相同的 cURL 请求?

java - Android 上的 IPv6 套接字

c# - 文件上传到文件流