【问题标题】:Is this peer to peer? UDP Java chat service这是点对点吗? UDP Java 聊天服务
【发布时间】:2021-01-13 18:46:13
【问题描述】:

我目前正在编写点对点 UDP 聊天服务。 我为每个客户端有两个线程,一个接收消息,一个发送消息,这样两者都可以同时完成。我一直在努力寻找如何“找出”其他客户端将连接到哪些端口,因此我决定创建一个“广播”类(线程),客户端一旦创建就会向其中发送消息。 Broadcast 将每个唯一的 InetAddress + Port 存储在一个 HashMap 中,然后将接收到的消息发送给 HashMap 中的每个 Client。

所以我的问题是:这甚至被认为是 P2P 吗?从技术上讲,它们不会直接将消息发送给对方。我真的很难找到一种方法来实现我的其他想法,例如只使用广播类来创建这个带有客户端信息的 HashMap,然后将这个 HashMap 传输给每个客户端,这样他们现在就可以直接发送给每个 Peer。但后来我遇到了其他问题,例如:我的接收线程如何将此 HashMap 传达给发送线程?

【问题讨论】:

    标签: java udp p2p


    【解决方案1】:

    确实,这不是 p2p。

    将您的程序分为两个步骤:首先,客户端在其主线程上从广播服务器获取连接详细信息,然后才会启动线程以进行侦听/发布。这是此类程序的常见模式。

    如果您不提前知道端口(因为您想使用操作系统分配的随机端口),您有两种选择:

    1. 让“接收线程”向广播服务器发送它正在侦听的端口,“发送线程”将从广播服务器拉出它需要发送的 IP/端口。线程是“接收线程”这一事实说明了它的角色,而不是不允许它发送请求。
    2. 您可以让两个线程都访问的对象(在初始化时传递给它们)来传递信息。该对象必须是线程安全的。

    在我看来,选项 1 更干净。它更简单,更可靠。

    【讨论】:

    • 谢谢。我设法做到了不同。我的广播类变成了一个“注册器”,每个客户端一旦创建,就会向它发送一个数据包。由于只有 X 数量的客户端注册后才会开始聊天,因此 Broadcast 会将每个唯一的 InetSocketAddress 存储在 ArrayList 中。一旦 X 个唯一的客户端注册完毕,注册器将向每个人发送唯一的 InetSocketAddresses,这样现在每个客户端都有关于其他客户端的信息。
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多