我正在尝试用 Java 实现一个小型 LAN IM 系统。我有一个 KDC(密钥分发中心),用于向用户发送会话密钥。这是我最初设计的图片:
关于与登录用户聊天的
步骤
:(
两个用户,A 和 B)
1.A
发送请求KDC
说他想与之交谈B
2.KDC
转发请求B
3.B
接受或拒绝请求
4. 如果B
接受,KDC
将发送A
's public key toB
和B
's public key to A
,否则发送 null
5.A
并B
生成一个密钥以相互聊天
现在我的问题:
我使用ServerSocket
实施KDC
。它将管理和分发公钥。我Socket
用来实现User
,我知道如何让一个User
沟通,KDC
但我不知道如何让一个User
沟通与另一个User
。所以我必须同时使用Socket
并ServerSocket
实施User
?如果A
同时与两个或更多其他用户交谈。如何处理 a 中的sockets
and ?server sockets
User
2 回答
你好我认为你应该通过netty-socketio实现它,在你的场景中,KDC应该知道每个节点,但每个节点不需要知道其他节点,所以KDC的关键功能是路由消息。尝试使用 socketio replace io 你会得到更好的性能!netty-socketio 的链接如下图! https://github.com/mrniko/netty-socketio
显然,服务器必须将消息推送给用户(转发的请求)。因此,要么用户保持对服务器开放的永久套接字连接,要么用户必须准备好接受来自服务器的新连接。
对于第一个选项,您可以通过服务器在用户之间路由所有消息,即就像服务器协商原始请求一样,它也分发消息。优点:基础设施比较简单,可以用相同的逻辑处理请求和消息,并且很容易将消息分发给多个用户。明显的缺点:服务器成为所有消息的瓶颈,并且在安全方面它会看到所有消息。
第二个选项意味着,是的,每个用户都必须有一个 ServerSocket 才能接受传入连接,以及通过套接字启动传出连接。在这种情况下,您必须找到一种可靠的方式来协商谁与谁联系。一个自然的解决方案是让发送聊天请求的用户也通过套接字连接到另一个用户的 ServerSocket。优点:消息可以直接在用户之间传递。缺点:更复杂的基础设施,尤其是当多个用户互相聊天时。而且它并不比集中式服务器解决方案更安全,因为它仍然需要服务器来处理请求。