我正在开发一款网络游戏,一般来说:
我有一个服务器,它为每个连接到它的客户端启动一个 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/