java - Socket 的 dataInputStream 是否知道如何处理对其进行多次写入?

标签 java sockets datainputstream

我正在开发一款网络游戏,一般来说:

我有一个服务器,它为每个连接到它的客户端启动一个 serverThread。
它的目的是监听来自特定客户端的消息并在服务器上处理它。
此外,对于每个打开的客户端,它都会启动一个 clientThread,它是来自服务器的消息的监听线程。
这两个线程非常简单且相似,都实现了 Runnable 接口(interface),因此重写了 run 方法。
每个 Run 方法都是某种无限循环,其启动命令(阻塞命令):

int 命令 = m_In.readInt();

然后根据接收到的命令通过 switch case 结构进行处理。
处理完成后,循环导致代码返回到阻塞 m_In.readInt()
等待另一个命令的到来。

我的问题是:我的网络游戏有足够的选项使用通过此 m_In 进行的通信,那么如果有两条或更多条消息几乎一起到达 clientThread,会发生什么情况,dataInputStream 将如何操作?
它会开始处理第一条消息,并在完成后获取某种队列上的第二条消息吗?或者它可能会丢弃第二条消息并且它会丢失? 也许该流有缓冲区,因此它将第二条消息存储在队列或其他东西中?

谢谢

最佳答案

流本质上期望数据以指定的顺序出现。如果有两个线程同时写入同一个流,就会发生不好的事情。

现在您当然可以同步对流的访问,并让两个线程交错写入(只要您在流上构建某种格式来告诉接收者如何读取数据),但您不明白这一点默认情况下。

通常,每个客户端线程都有自己的连接,因此有自己的要写入的流。显然,服务器可以“同时”从多个流中读取数据,这是正常的服务器模式。

关于java - Socket 的 dataInputStream 是否知道如何处理对其进行多次写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7801043/

相关文章:

java - 通过 GSP 和 Groovy 代码在表单或文本区域、textForm 中显示文本值

JavaScript、node.js 在继续之前等待 socket.on 响应

javascript - Node.JS + Socket.io,将套接字事件处理程序移动到外部模块?

Java 输入流转换/签名问题

java - 为什么服务器不写给客户端?

java - 在 Java 中创建 bytea 数组以传递给 Postgresql 存储过程

java - 我在哪里可以查看 Eclipse 中的 Tomcat 日志文件?

c++ - 鉴于此示例,与使用多线程或进程相比,轮询设计对我有何好处?

java - DataInputStream不读取小文件

java - 当表在 mysql 中更新时,如何在 spring boot 中调用方法