我正在使用客户端 - 服务器架构在Java中创建Intra Office Messaging System。我想要实现的功能包括:实时聊天和向特定用户或用户组发送消息,文件传输和语音聊天。
我已经实现了客户端可以在服务器上登录的服务器和客户端模块。我已经使用了DataInputStream
和DataOutputStream
。当用户提交用户名和密码时,我将它们存储在由分号“;”分隔的单个字符串中。然后我使用DataInputStream
将此字符串发送到服务器,在那里我将它们分开并运行数据库查询并向客户端应用程序发送适当的确认。
现在我想实现聊天和消息传递。我的问题是,我应该使用相同的方法吗?或者有更好的解决方案吗?此外,如何将消息发送到特定客户端(客户端A只想向客户端B发送消息)。在提出解决方案时,请记住我必须实现语音聊天(gstreamer)作为文件传输!!!
此外,我维护一个数组,其中包含登录到服务器的所有客户端的名称,该服务器用于向每个客户端显示登录客户端列表。
答案 0 :(得分:3)
首先,通过将用户名和密码作为纯文本字符串发送,您实际上可以自由地放弃它们 - 任何拥有一些基本工具的人都可以嗅探用户名和密码。您将需要阅读加密以及如何保护连接。 Java有一个内置的加密库,这使得这很容易做到。
如果可能的话,我建议你选择一个已经开发的聊天协议,比如XMPP(Jabber),已经有很多免费的Java库实现,比如Smack,它会为你做一切。除非你为一个不允许使用外部图书馆的学校项目做这件事,否则真的不应该在这里重新发明轮子,这本身就是非常雄心勃勃的。 XMPP支持文本聊天,语音聊天和文件传输。
还有一些功能齐全的开源聊天客户端,您可以根据自己的特定需求进行修改。但要记住的一件事是开源项目的许可。某些开源许可证(如流行的GPL)要求在项目中使用开源项目的任何部分都要求您发布整个项目的源代码。这对公司来说可能是非常灾难性的,所以要小心。
如果您仍想从头开始,那么您需要实现自己的协议通信。您必须自己设计,同时考虑如何合并gstreamer和文件传输。
同样,我建议至少要查看一些已经设计好的协议,比如XMPP,以获得一些想法。
通常,协议有,
例如,一个真正基本的协议可能是,
Request type: 1 byte. 1 = text, 2 = voice data, 3 = file transfer, 4 = request for currently logged-in client list Destination: int (IP address) Time: long. Best to send this as UTC time, e.g. what System.currentTimeMillis returns Length of data: int Data: variable length data, depending on type
然后,对于发送的每种类型的数据,您将以不同方式实施数据,
Text: string as sent by DataStream Voice: voice data from gstreamer (not sure how gstreamer works) File transfer: File name: String as sent by DataStream Length: long Data: As read from FileInputStream List of currently-logged in clients: Data: as sent by DataStream.writeObject祝你好运