【问题标题】:Implementing a protocol for a client-server socket communication in Java在 Java 中实现客户端-服务器套接字通信的协议
【发布时间】:2015-03-29 16:04:25
【问题描述】:

我正在为 Android 开发一款多人回合制游戏 - 一款扑克游戏。 我几乎完成了 clinet 游戏。现在我需要实现多人游戏。

我考虑过使用 Web 服务,但我没有这方面的经验,我知道套接字通信更快。

我有一些用 Java 编写套接字通信的经验: 使用 ObjectOutputStream 和 ObjectInputStream 交换数据(本例中为游戏状态和回合动作)。

但我对这种方法有一点担忧——服务器端依赖于平台。 如果我想让 iPhone 开发人员为 iPhone 创建应用程序,他不能这样做,因为服务器需要 Java 代码。我说的对吗?

还有一个问题: 我可以实现普通套接字通信,然后轻松将其更改为安全套接字通信吗?只是我需要学习如何使用 SSL,我现在不想深入。

谢谢!

【问题讨论】:

  • 当然看起来一个简单的基于 HTTP 的协议会更容易。在任何情况下,“套接字”都不依赖于平台。在某些协议调用中,套接字需要数据。套接字不“期望 Java 代码”。
  • 如果服务器需要一个自定义对象 (ObjectInputStream.in(CustomObject)),从客户端我将不得不在 Java 中使用 ObjectInputStream.out(CustomObject)。我认为自定义对象在 ObjectiveC 中的编写方式不同..
  • 如果您正在序列化对象,当然可以。这只是通过套接字传输数据的一种方式。套接字期望数据; 定义你发送和期望接收的数据,以及一旦你有了这些数据如何处理。
  • 没有。服务器应该独立于平台。服务器大多是。客户端采用服务器强制执行的协议。
  • @greenapps,我猜协议是我的问题。在我之前的项目中,客户端只发送了一个 requestCode (int),服务器发送回数据,而客户端则期待特定的对象。没有协议可以强制执行任何事情。您能否提供一个链接来解释如何为客户“采用”实现协议?

标签: java android sockets


【解决方案1】:

这是一个老问题,但对我和希望其他人来说很重要,所以就这样吧。我目前正在从事一个项目,该项目涉及使用 Java 套接字的不同平台上的多台计算机。我使用套接字是因为最终我可以使用任何语言,只要我遵守我编写的协议。我也有一些预定义的整数常量来控制以什么顺序预期的数据。例如,在启动某个特定函数之前,我会发送一个特定的整数,然后是预期的数据。任何未按预期顺序出现的内容都会导致错误。因此,只要语言/运行时提供通过 TCP 套接字写入整数和字符串的能力,它就应该可以工作。我认为这涵盖了绝大多数主要的编程语言。

至于 SSL 套接字,我也在这样做 :) 我开始使用非 SSL 套接字,然后重构以使其与 SSL 套接字一起工作。我很惊讶它是多么容易。我会推荐这个 git repo 作为示例代码:https://github.com/jawi/ssl-socket-demo

最终,我计划让使用我的应用程序的用户在首次运行应用程序时在本地生成密钥库和自签名证书,作为其初始设置的一部分。只要他们将相同的密钥库导入到他们在网络中使用的每个其他节点上的应用程序中,他们就能够相互交谈。这将确保以他们的网络独有的方式对通信进行加密。当然,这将要求他们将密钥存储文件安全地存储在本地文件系统中:)

【讨论】:

  • 它还会确保他们不知道自己在与谁交谈,因此没有真正的安全性。
  • @EJP 不确定您的意思。你能详细说明吗?他们可以提供由经过验证的提供商签署的自己的证书。我也可以提供一个作为应用程序的一部分(我确实计划签署 jar),但是世界上任何使用该应用程序的人都可以连接到任何网络上的任何计算机,因为他们都使用相同的证书。你认为什么会更好?
最近更新 更多