在 Memory Game Client - 服务器应用程序中使用的 actionListener
Posted
技术标签:
【中文标题】在 Memory Game Client - 服务器应用程序中使用的 actionListener【英文标题】:actionListener using in Memory Game Client - server application 【发布时间】:2012-02-14 07:10:45 【问题描述】:我正在解决一个问题,但我有点卡住了。我将从一些背景开始。 我正在编写记忆游戏(例如,它类似于http://www.mathsisfun.com/games/memory/index.html)。它应该是客户端-服务器应用程序。 客户端 - 在 java 服务器 - 在 C 中 情况是 1 个服务器,N 个客户端 服务器将有游戏列表 - 每场比赛有两名玩家 每个游戏都将在 onw 进程中单独处理 - 我使用 fork
客户端是 java swing form 应用程序 - 并重新设置播放器 客户端和服务器仅使用两种方法(分别是函数)进行通信
client - void sendMessageToServer(String message), String recieveMessageFromerver() 服务器 - recieveMessage(void *vptr, size_t maxlen, int socketfileDesc) ,int sendMessageToClient(char* msg, int socket) 很简单 - 我只是将字符串消息从服务器发送到客户端,从客户端发送到服务器 I,这些都是编码操作
现在我的问题: 为了更轻松地测试客户端,也用 java 制作了服务器,我只用一个游戏解决问题 - 一台服务器,2 个客户端(都在 java 中) 所以我有3节课 客户: - 显示发件人, - 有关于游戏的信息, - 具有静态方法 CreateAndShowGUI(String serverInsanceHandle) => 显示 - 表单,创建客户端实例 服务器: - 只有两条消息 - 接收,发送我之前提到的 测试:
public class Test
/**
* @param args
*/
public static void main(String[] args)
final Server server = new Server();
javax.swing.SwingUtilities.invokeLater(new Runnable()
public void run()
Client.createAndShowGUI(server);
Client.createAndShowGUI(server);
);
这里: 我的问题是: 对于简单的测试,我有 4x4 游戏卡,这意味着 8 对 我有数组 JButton[] buttonsArray = new JButton[16];每个按钮上都是带有卡片图片的 ImageIcon,每个按钮都添加了 actionListenner(privateClass) 在实现 ActionListener 的 privateClass 中是方法 actionPerformed ,在那里我更改了客户端的设置 - 我向服务器发送消息,服务器向我发送回消息,我应该在客户端做什么。 我的问题是我有两个客户端和一个服务器。 当我在 client1 中进行操作时,它仅在 client1 中有效,但我现在需要以某种方式将其交给 client2。 我可以拥有应该在服务器端查看的卡片字段,或者我可以拥有字符串消息字段 - 带有编码更改,但我现在不知道如何让 client2 知道 client1 做了一些操作。通信必须通过服务器: 像“你好,我是 client1,我按下了 2 号按钮,所以你的 client2 应该要求服务器进行更改”,但我不能这样做。 那我该怎么办?
注意:它应该是 TCP 通信的“模拟”,所以我将使用 tcp 套接字——但这现在可能并不重要。
【问题讨论】:
【参考方案1】:我将假设您的服务器有两件事:
-
服务器正在维护记忆游戏的状态(IE,当前翻转了哪些卡片,哪个客户端发现了正确的卡片对等)。我将把它称为 GameState 对象。
服务器还为每个客户端维护一个唯一的 Socket 连接
在我看来,您的客户端首先更新自己的本地 GameState,然后告诉服务器更新其 GameState。也就是说,我会进行以下更改:
-
每次客户端想要翻转卡片或进行其他修改 GameState 的操作时,都会向服务器发送一条消息,告诉它更新其 GameState。
每当服务器更新其 GameState 时,让它将整个 GameState 发送给所有客户端。
将您的客户端设计为仅显示从服务器接收到的 GameState。
这样,您的服务器可以控制主 GameState,而您的客户端更像该 GameState 的“观察者”。
【讨论】:
除了每次进行更新时发送整个游戏状态之外,您还可以在客户端首次连接时发送整个游戏状态,然后只向他们发送消息以更新他们自己的游戏状态视图。但就像 Ben 所说的,您希望所有对新游戏状态和玩家动作的实际处理都在服务器上进行处理。这对于游戏来说也是一个安全的事情,防止人们通过向服务器发送非法动作来作弊。 我做的几乎和本写的一样。我发送带有操作的服务器消息,服务器将客户端消息发送回客户端应该更改的内容。但我不知道如何向所有客户发送消息 - 这实际上是我的问题。但是像观察者模式这样的东西可能是我的解决方案。所以我添加到服务器端的观察者列表中,如果服务器收到有关更改的消息(更改前的响应操作),服务器通知观察者列表中的所有观察者 = 将带有更改的消息发送给列表中的所有客户端。谢谢,我只是忘记了观察者模式存在:D 啊,错过了你所说的关于实际发送消息的部分。它比这复杂一点,但我通常将客户端到服务器和服务器到客户端 Socket 连接的 InputStream 和 OutputStream 包装在 ObjectInputStream 和 ObjectOutputStream 实例中。然后,只要您的 GameState 对象(或您选择实现的任何消息对象)实现 Serializable,您就可以将这些对象直接通过套接字写入远端。有点酷:) 我认为 ObjectInputStream 和 ObjectOutputStream 不可能在那里使用,因为服务器将在 C 中并且 C 无法使用它(我不确定它是否 100% 正确,有人说我这是不可能的)这就是我使用缓冲阅读器的原因。我必须使用不依赖于编程语言的东西..以上是关于在 Memory Game Client - 服务器应用程序中使用的 actionListener的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 9 Swift 4 Memory Game 小程序开发
LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷
LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷
LVGL开发 | lv_lib_100ask之lvgl数字对拼图小游戏(lv_100ask_memory_game)-接口简单使用便捷
(2008) MySQL client ran out of memory怎么解决
Spark- Spark Yarn模式下跑yarn-client无法初始化SparkConext,Over usage of virtual memory