我正在尝试用 Java 实现一个小型 LAN IM 系统。我有一个 KDC( key 分发中心)用于向用户分发 session key 。这是我最初设计的图片:
与登录用户聊天的步骤:
(两个用户,A 和 B)
1. A
向 KDC
发送请求,表示想要与 B
通话
2. KDC
将请求转发给B
3. B
接受或拒绝请求
4. 如果B
接受,KDC
会将A
的公钥发送给B
和B
的公钥到 A
,否则发送 null
5. A
和 B
生成互相聊天的 key
现在我的问题:
我使用 ServerSocket 来实现 KDC。它将管理和分发公钥。我使用 Socket
来实现 User
,并且我知道如何让 User
与 KDC
通信,但我不知道不知道如何让用户
与另一个用户
进行通信。所以我必须同时使用Socket
和ServerSocket
来实现User
?如果A
同时与两个或更多其他用户通话。如何处理用户
中的套接字
和服务器套接字
?
最佳答案
显然服务器必须向用户推送消息(转发的请求)。因此,要么用户保持与服务器打开的永久套接字连接,要么用户必须准备好接受来自服务器的新连接。
对于第一个选项,您可以通过服务器在用户之间路由所有消息,即,就像服务器协商原始请求一样,它也分发消息。优点:基础设施相对简单,可以用相同的逻辑处理请求和消息,并且很容易将消息分发给多个用户。明显的缺点:服务器成为所有消息的瓶颈,并且从安全角度来说它会看到所有消息。
第二个选项意味着,是的,每个用户必须有一个 ServerSocket 才能接受传入连接,以及通过套接字发起传出连接。在这种情况下,您必须找到一种可靠的方式来协商谁联系谁。一个自然的解决方案是让发送聊天请求的用户也通过 Socket 连接到其他用户的 ServerSocket。优点:消息可以在用户之间直接传递。缺点:基础设施更加复杂,尤其是当多个用户互相聊天时。而且它并不比集中式服务器解决方案更安全,因为它仍然需要服务器来处理请求。
关于Java ServerSocket和Socket实现IM系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14172896/