0

我正在使用客户端-服务器架构在 Java 中创建内部办公室消息系统。我想要实现的功能是:与特定用户或用户组的实时聊天和消息传递、文件传输和语音聊天。

我已经实现了服务器和客户端模块,客户端可以使用它们登录服务器。我已经使用DataInputStreamDataOutputStream为此。当用户提交用户名和密码时,我将它们存储在由分号“;”分隔的单个字符串中 然后我将这个字符串发送到服务器,使用DataInputStream我将它们分开并运行数据库查询并向客户端应用程序发送适当的确认。

现在我想实现聊天和消息传递。我的问题是,我应该为此使用相同的方法吗?还是有更好的解决方案?另外,我如何将消息发送给特定的客户端(客户端 A 只想向客户端 B 发送消息)。在提出解决方案时,请记住,我还必须实现语音聊天(gstreamer)作为文件传输!!!

另外,我维护了一个数组,其中包含登录到服务器的所有客户端的名称,该数组用于向每个客户端显示登录客户端的列表。

4

1 回答 1

3

首先,通过将用户名和密码作为纯文本字符串发送,您实际上是在自由地泄露它们 - 任何拥有一些基本工具的人都可以嗅探用户名和密码。您将需要阅读密码学以及如何保护连接。Java 有一个内置的密码库,这使得这很容易做到。

如果可能的话,我会推荐使用已经开发好的聊天协议,比如 XMPP (Jabber),已经有很多免费的 Java 库实现,比如 Smack,可以为你做任何事情。真的没有必要在这里重新发明轮子,除非你是为一个不允许使用任何外部库的学校项目这样做的,这本身就是非常雄心勃勃的。XMPP 支持文本聊天、语音聊天和文件传输。

还有几个功能齐全的开源聊天客户端,您可以对其进行修改以满足您的特定需求。不过要记住的一件事是开源项目的许可。一些开源许可证,如流行的 GPL,要求在项目中使用开源项目的任何部分都需要您发布整个项目的源代码。这对公司来说可能是极其灾难性的,所以要小心。

如果您仍然想从头开始,那么您需要实现自己的通信协议。您必须自己设计,同时考虑如何合并 gstreamer 和文件传输。

同样,我建议至少查看一些已经设计好的协议,例如 XMPP,以获得一些想法。

通常,协议有,

  • 一些数据解释了这是什么类型的请求/响应。这可以是存储为单个字节的数值,也可以是一些文本字符串,如在 HTTP 中所做的那样
  • 更多关于消息的对象的数据。可以是 IP 地址、用户名、两者的组合等。如果您直接进行通信(即不通过中间人服务器)则不需要
  • 发送请求的时间
  • 数据本身
  • 某种加密。最好在用户获得授权后启动

例如,一个非常基本的协议可能是,

请求类型:1 个字节。1 = 文本,2 = 语音数据,3 = 文件传输,4 = 请求当前登录的客户列表

目的地:int(IP地址)

时间:长。最好将此作为 UTC 时间发送,例如 System.currentTimeMillis 返回的内容

数据长度:int

数据:可变长度数据,取决于类型

然后,对于发送的每种类型的数据,您会以不同的方式实现数据,

    
文本:DataStream 发送的字符串

语音:来自 gstreamer 的语音数据(不确定 gstreamer 是如何工作的)

文件传输:

    文件名:DataStream 发送的字符串

    长度:长

    数据:从 FileInputStream 读取

当前登录的客户端列表:
    数据:由 DataStream.writeObject 发送

祝你好运

于 2013-02-23T19:38:05.807 回答