Java ServerSocket和Socket实现IM系统

标签 java sockets serversocket

我正在尝试用 Java 实现一个小型 LAN IM 系统。我有一个 KDC( key 分发中心)用于向用户分发 session key 。这是我最初设计的图片: enter image description here
与登录用户聊天的步骤:
(两个用户,A 和 B)
1. AKDC 发送请求,表示想要与 B 通话
2. KDC 将请求转发给B
3. B 接受或拒绝请求
4. 如果B接受,KDC会将A的公钥发送给BB 的公钥到 A,否则发送 null
5. AB 生成互相聊天的 key
现在我的问题:
我使用 ServerSocket 来实现 KDC。它将管理和分发公钥。我使用 Socket 来实现 User,并且我知道如何让 UserKDC 通信,但我不知道不知道如何让用户与另一个用户进行通信。所以我必须同时使用SocketServerSocket来实现User?如果A同时与两个或更多其他用户通话。如何处理用户中的套接字服务器套接字

最佳答案

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

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

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

关于Java ServerSocket和Socket实现IM系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14172896/

相关文章:

java - TLS_RSA_WITH_3DES_EDE_CBC_SHA 是否等同于 SSL_RSA_WITH_3DES_EDE_CBC_SHA

sockets - tcp 两端尝试同时连接

java - 阻塞直到 DataInputStream 可用

java - 为什么 DataInputStream.readUTF() 导致主线程永远等待? [套接字编程]

java - 尝试从输入流检索文本时应用程序挂起

java - Grails 如何在运行时创建方法 Ex obj.setName("Abhay)

java - 在 strings.xml 中使用长值时,Lint 给出 "Wrong format type"

python-2.7 - 如何并排使用 Tkinter 和 Socket

java - 匿名类怎么可以有参数呢?

java - 如何在 Spring Integration 中从 TCP 读取流(消息)