Java ServerSocket和Socket实现IM系统

Java ServerSocket和Socket实现IM系统,java,sockets,serversocket,Java,Sockets,Serversocket,我正在尝试用Java实现一个小型LAN IM系统。我有一个KDC(密钥分发中心),用于向用户分发会话密钥。这是一张关于我最初设计的照片: 与登录用户聊天的步骤: (两个用户,A和B) 1. Asend request toKDC表示他想与B 2. KDC将请求转发到B 3. B接受或拒绝请求 4.如果B接受,KDC将A的公钥发送到B,B的公钥发送到A,否则发送空值 5. A和B生成一个密钥以相互聊天 现在我的问题: 我使用ServerSocket实现KDC。它将管理和分派公钥。我使用Socke

我正在尝试用Java实现一个小型LAN IM系统。我有一个KDC(密钥分发中心),用于向用户分发会话密钥。这是一张关于我最初设计的照片:
与登录用户聊天的步骤:
(两个用户,A和B)
1.
A
send request to
KDC
表示他想与
B

2. <代码>KDC将请求转发到
B

3. <代码>B接受或拒绝请求
4.如果
B
接受,
KDC
A
的公钥发送到
B
B
的公钥发送到
A
,否则发送空值
5.
A
B
生成一个密钥以相互聊天
现在我的问题

我使用
ServerSocket
实现
KDC
。它将管理和分派公钥。我使用
Socket
实现
User
,我知道如何让
用户
KDC
通信,但我不知道如何让
用户
与另一
用户
通信。因此,我必须同时使用
Socket
ServerSocket
来实现
User
?如果
A
同时与两个或多个其他用户通话。如何处理
用户中的
套接字
服务器套接字

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

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

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


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

与您的问题无关,但是,除非您这样做是为了学习或娱乐,否则为什么不使用jabber/xmpp服务器呢?这个问题已经解决了。@guidogaría这是我的信息安全作业,但不是实际应用:)UserA将向服务器发送消息,而不是将消息路由到UserB。显然,你必须制定一个协议。另一个选项是将用户A的IP详细信息转发给用户B(反之亦然),并启动连接。