在同一个套接字上接收多条消息
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);
}
}
- 客户端连接
- 它将监听消息
如您所见,如果您在收到翻牌的同时收到玩家姓名和玩家座位,则消息可能会发生冲突。
我的问题是如何避免这种情况?我需要什么或我可以寻找什么来解决这个问题。
如果能得到所有提示或答案,我将不胜感激! :)
在服务端,一个播放器表示为一个线程,读写accept得到的数据socket。 "Table"(或客户端控件 sw)负责将游戏事件定向到个人或所有玩家,传递要发送到相关线程的消息。
有些事件应该推迟到当前交易(或回合)结束,例如,新玩家坐在 table。这可以通过为每个 player/thread 设置一个队列来实现,以便在游戏达到回合间状态时读取。
在交易期间,状态机可以控制什么是玩家的接受table - 尽管玩家应该根据协议进行编程:例如,当被问及要做什么时,必须以任何行动回应游戏允许。
我研究了 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);
}
}
- 客户端连接
- 它将监听消息
如您所见,如果您在收到翻牌的同时收到玩家姓名和玩家座位,则消息可能会发生冲突。
我的问题是如何避免这种情况?我需要什么或我可以寻找什么来解决这个问题。 如果能得到所有提示或答案,我将不胜感激! :)
在服务端,一个播放器表示为一个线程,读写accept得到的数据socket。 "Table"(或客户端控件 sw)负责将游戏事件定向到个人或所有玩家,传递要发送到相关线程的消息。
有些事件应该推迟到当前交易(或回合)结束,例如,新玩家坐在 table。这可以通过为每个 player/thread 设置一个队列来实现,以便在游戏达到回合间状态时读取。
在交易期间,状态机可以控制什么是玩家的接受table - 尽管玩家应该根据协议进行编程:例如,当被问及要做什么时,必须以任何行动回应游戏允许。