java - Java 中的客户端服务器 LAN Messenger

标签 java client-server chat file-transfer lan

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

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

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

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

最佳答案

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

如果可能,我建议使用已经开发的聊天协议(protocol),例如 XMPP (Jabber),该协议(protocol)已经存在许多免费的 Java 库实现,例如 Smack,它可以为您完成所有工作。实际上不需要在这里重新发明轮子,除非您是为一个不允许使用外部库的学校项目这样做,这本身就非常雄心勃勃。 XMPP 支持文本聊天、语音聊天和文件传输。

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

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

我再次建议您至少查看一些已经设计的协议(protocol),例如 XMPP,以获得一些想法。

通常,协议(protocol)有,

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

例如,一个真正基本的协议(protocol)可能是,

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

祝你好运

关于java - Java 中的客户端服务器 LAN Messenger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15043377/

相关文章:

java - 在 web.xml 中发现以元素 'display-name' 开头的无效内容

java - 将数据写入 OutputStream 而不使用 CLDC 关闭

c# - WCF 返回 ArrayOfKeyValueOfintstringKeyValueOfintstring[] 而不是 Dictionary<int, string> 和 Array instread List

c - 在提示上方打印聊天消息?

php - 如何与apache服务器并行运行 Ratchet websocket服务器

java - 构造函数中的继承

java - TCP 套接字无法接收数据包

java - 注入(inject)错误 : org. apache.maven.plugin.install.InstallMojo java.lang.NoClassDefFoundError

Java套接字: Client-server communication is stuck with multi-threading if more than 1 client

JavaFX:如何使回车键提交TextArea