首先,通过将用户名和密码作为纯文本字符串发送,您实际上是在自由地泄露它们 - 任何拥有一些基本工具的人都可以嗅探用户名和密码。您将需要阅读密码学以及如何保护连接。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 发送
祝你好运