【发布时间】: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);
}
}
- 客户端连接
- 它将监听消息
如您所见,如果您在收到 flopp 卡的同时收到玩家名称和玩家座位,则消息可能会发生冲突。
我的问题是如何避免这种情况?我需要什么或者我可以搜索什么来解决这个问题。 我将不胜感激我能得到的所有提示或答案! :)
【问题讨论】:
-
在一个套接字连接上,您将收到一个客户端发送的数据,并且消息(如上)将一个接一个地到达。 (您 connect 在一个监听套接字上,但 accept 创建一个单独的数据套接字。)
-
laune: 问题是当客户端连接时,服务器端启动了一个新线程,首先发生的事情是服务器上的线程会先监听你的名字发送。之后就是playerSeat。并且一旦服务器收到 playerSeat,线程就会将席位发送给所有其他 clentThreads。这可能会在游戏回合处于活动状态时发生。所以消息可能会发生冲突。
-
AFAIK,新玩家只能在交易之间进入游戏。新玩家线程必须排队并延迟,直到可以加入。
-
Laune:这是一个聪明的解决方案,但是如果有 4 个人在等待并且他们同时坐下,那么消息也会发生冲突。感谢您的回答!
-
我不这么认为。服务器中的线程应该监听一些 Table 事件并通知他们的播放器客户端正在发生的事情。因此,每个线程都知道 +4 并通知其客户端。研究状态机,协议的基本设计工具。