我试图用Java实现一个小型局域网IM系统。我有一个KDC(密钥分发中心),用于向用户发送会话密钥。下面是一张关于我的初步设计的图片:

与登录用户聊天的步骤是:
(两个用户,A和B)
A向KDC发送请求,说他想和B谈谈KDC向B转发请求B接受或拒绝请求B接受,KDC将把A的公钥发送给B,B的公钥发送给A,否则发送空。A和B生成一个相互聊天的秘密密钥
现在我的问题:
我使用ServerSocket实现KDC。它将管理和分发公钥。我使用Socket实现User,我知道如何让User与KDC通信,但我不知道如何让User与另一个User通信。所以我必须同时使用Socket和ServerSocket来实现User?如果A同时与两个或两个以上的用户进行对话。如何在sockets和server sockets中处理User发布于 2017-03-17 10:26:32
显然,服务器必须将消息推送给用户(转发的请求)。因此,要么用户保持对服务器的永久套接字连接打开,要么用户必须准备好接受来自服务器的新连接。
对于第一个选项,您可以通过服务器在用户之间路由所有消息,也就是说,当服务器协商原始请求时,它也会分发消息。优点:基础设施相对简单,您可以用相同的逻辑处理请求和消息,并且向多个用户分发消息很容易。明显的缺点是:服务器成为所有消息的瓶颈,从安全性的角度来看,它将看到所有消息。
第二个选项意味着,是的,每个用户都必须有一个ServerSocket才能接受传入的连接,以及通过套接字启动传出连接。在这种情况下,您必须找到一种可靠的方式来协商谁与谁联系。一个自然的解决方案是让用户发送聊天请求,并通过套接字连接到另一个用户的ServerSocket。优点:消息可以直接在用户之间传递。缺点:基础设施要复杂得多,特别是当多个用户相互聊天时。而且它并不比集中式服务器解决方案更安全,因为它仍然需要服务器来处理请求。
发布于 2017-03-17 10:16:15
嗨,我认为你应该用netty-socketio来实现它,在您的场景中,KDC应该知道每个节点,但是每个节点不需要知道其他节点,所以KDC的关键功能是路由消息。尝试使用socketio替换io,您将得到一个更好的表现!netty-socketio的链接如下所示!https://github.com/mrniko/netty-socketio
https://stackoverflow.com/questions/14172896
复制相似问题