在同一个套接字上接收多条消息

Receive multiple messages on same socket

我研究了 Java 4 个月,并决定用 javaFX 制作一个简单的德州扑克游戏。客户端连接到服务器,服务器为每个客户端(最多 10 个客户端)创建一个新线程。

我的问题是同时处理多条消息。如果你看看我下面的代码你就会明白:(这是客户端)

while (true){
            messageIn = in.readUTF();

            if (messageIn.equals("seat")){
                String name = in.readUTF();
                String seat = in.readUTF();
                gameScreenController.addPlayerToSeat(name, seat);
            }
            else if (messageIn.equals("hand")){
                String seat = in.readUTF();
                int handCard1 = in.readInt();
                int handCard2 = in.readInt();
                gameScreenController.handCardToSeat(handCard1, handCard2, seat);
            }
            else if (messageIn.equals("flopp")){
                int floppCard1 = in.readInt();
                int floppCard2 = in.readInt();
                int floppCard3 = in.readInt();
                gameScreenController.flopp(floppCard1, floppCard2, floppCard3);
            }
            else if (messageIn.equals("turn")){
                int turnCard = in.readInt();
                gameScreenController.turn(turnCard);
            }
            else if (messageIn.equals("river")){
                int riverCard = in.readInt();
                gameScreenController.turn(riverCard);
            }   
        }
  1. 客户端连接
  2. 它将监听消息

如您所见,如果您在收到翻牌的同时收到玩家姓名和玩家座位,则消息可能会发生冲突。

我的问题是如何避免这种情况?我需要什么或我可以寻找什么来解决这个问题。 如果能得到所有提示或答案,我将不胜感激! :)

在服务端,一个播放器表示为一个线程,读写accept得到的数据socket。 "Table"(或客户端控件 sw)负责将游戏事件定向到个人或所有玩家,传递要发送到相关线程的消息。

有些事件应该推迟到当前交易(或回合)结束,例如,新玩家坐在 table。这可以通过为每个 player/thread 设置一个队列来实现,以便在游戏达到回合间状态时读取。

在交易期间,状态机可以控制什么是玩家的接受table - 尽管玩家应该根据协议进行编程:例如,当被问及要做什么时,必须以任何行动回应游戏允许。