java发送消息,一个播放器类的实例,可以与其他玩家通信
首先,很抱歉,我问了一个问题,却没有展示我对如何解决这个问题的任何想法。 我有一个任务如下
Create 2 player instances
one player should send message to second player ("initiator player")
when a player recieves message it should reply with a message that contains the recieved message
concatenated with counter of how many message this player already sent. And both players run in thesame process.
我不知道该怎么做,尤其是发送消息和回复消息的想法
现在,假设它是一个纯java实现,不使用任何框架、spring、websocket等
我也想到了生产者-消费者方法,但我想得到一个简单的解释,可能是发送和应答的最小工作代码,我想我回避的是通信模式,这只是一个递归发送方法和另一个获取方法(接收)这条消息吗
# 1 楼答案
消息传递是一个抽象概念。可以将消息视为必须以某种方式发射、传输、接收和处理的数据的一部分。它与特定的编程语言、框架或库无关。除了Spring之外,Websocket、JMS等消息在诸如Win32 API、D-Bus、networking之类的低级应用程序中无处不在
对于您的任务,消息可以只是一个字符串。不需要将其表示为JSON/XML/etc,因为两个播放器都在同一个进程中运行
最初的任务描述相当宽泛。在我看来,你不需要递归,而需要一种钟摆。第一个播放器发送初始化消息并等待响应。同时,第二个播放器接收初始化消息,将其计数器添加到消息中并回复。然后第一个玩家在收到响应后醒来,添加他的计数器并发回。这种交流一再重复。另外,在得到上一条消息的答案之前,每个玩家不得发送下一条消息
Blocking queues是纯Java中一个进程内的最佳方法
考虑下面的代码:
样本输出:
PS您可能会在机器上获得稍微不同的输出,如下所示:
这是因为玩家在不同的线程中工作。可能出现以下情况:
这种行为是正确的。玩家通过队列同步,例如,第一个玩家在回答之前不会发送新消息。但是,将日志打印到控制台与发送/接收消息不同步(并且不能同步)
PS2仅使用一个阻塞队列(甚至使用单个互斥)即可解决该任务。但两个单独的队列更适合用于说明和解决方案的可能扩展