【问题标题】:Receive multiple messages on same socket在同一个套接字上接收多条消息
【发布时间】:2015-01-01 13:24:33
【问题描述】:

我学习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. 它将监听消息

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

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

【问题讨论】:

  • 在一个套接字连接上,您将收到一个客户端发送的数据,并且消息(如上)将一个接一个地到达。 (您 connect 在一个监听套接字上,但 accept 创建一个单独的数据套接字。)
  • laune: 问题是当客户端连接时,服务器端启动了一个新线程,首先发生的事情是服务器上的线程会先监听你的名字发送。之后就是playerSeat。并且一旦服务器收到 playerSeat,线程就会将席位发送给所有其他 clentThreads。这可能会在游戏回合处于活动状态时发生。所以消息可能会发生冲突。
  • AFAIK,新玩家只能在交易之间进入游戏。新玩家线程必须排队并延迟,直到可以加入。
  • Laune:这是一个聪明的解决方案,但是如果有 4 个人在等待并且他们同时坐下,那么消息也会发生冲突。感谢您的回答!
  • 我不这么认为。服务器中的线程应该监听一些 Table 事件并通知他们的播放器客户端正在发生的事情。因此,每个线程都知道 +4 并通知其客户端。研究状态机,协议的基本设计工具。

标签: java sockets messages


【解决方案1】:

在服务器上,一个玩家被表示为一个线程,读写accept获得的数据socket。 “表”(或客户端控制软件)负责将游戏事件定向到单个或所有玩家,将要发送的消息传递到相关线程。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多