Java ServerSocket和Socket实现IM系统

时间:2013-01-05 14:47:20

标签: java sockets serversocket

我正在尝试用Java实现一个小型的LAN IM系统。我有一个KDC(密钥分发中心),用于向用户分派会话密钥。这是我最初设计的图片: enter image description here
关于与登录用户聊天的步骤
(两个用户,A和B)
1. AKDC发送请求表示他想与B进行对话 2. KDC向[{1}}转发请求 3. B接受或拒绝请求 4.如果B接受,B会将KDC的公钥发送到AB的公钥B,否则发送null
5. AA生成一个秘密密钥,以便彼此聊天 现在我的问题
我使用B来实现ServerSocket。它将管理和发送公钥。我使用KDC来实现Socket,我知道如何让UserUser进行通信,但我不知道如何让KDC进行通信与另一个User。所以我必须同时使用UserSocket来实现ServerSocket?如果User同时与两个或更多其他用户交谈。如何处理A中的socketsserver sockets

2 个答案:

答案 0 :(得分:0)

您好我认为您应该通过netty-socketio实现它,在您的场景中,KDC应该知道每个节点,但每个节点不需要知道其他节点,因此KDC的关键功能是路由消息。 尝试使用socketio替换你将获得更好的性能! netty-socketio的链接如下图所示! https://github.com/mrniko/netty-socketio

答案 1 :(得分:0)

显然,服务器必须将消息推送给用户(转发的请求)。因此,用户要么保持对服务器的永久套接字连接,要么用户必须准备好接受来自服务器的新连接。

对于第一个选项,您可以通过服务器在用户之间路由所有消息,即,当服务器协商原始请求时,它也会分发消息。优点:基础架构相对简单,您可以使用相同的逻辑处理请求和消息,并且可以轻松地将消息分发给多个用户。显而易见的缺点:服务器成为所有消息的瓶颈,安全方面它将看到所有消息。

第二个选项意味着,是的,每个用户必须拥有一个ServerSocket才能接受传入连接,以及通过套接字启动传出连接。在这种情况下,您必须找到一种可靠的方式来协商谁与谁联系。一个自然的解决方案是让发送聊天请求的用户也通过Socket连接到另一个用户的ServerSocket。优点:消息可以直接在用户之间传递。缺点:基础设施复杂得多,尤其是当多个用户互相聊天时。它并不比集中式服务器解决方案更安全,因为它仍然需要服务器来处理请求。