5

所以我是Java新手,我做了一点c编程。我正在尝试创建一个虚拟节点网络,每个节点都需要是一个线程。节点只被允许与它们的邻居节点交谈。将有一个可以与任何节点通信的主节点,但节点必须相互通信才能回到主节点。主节点邻居可以与主节点对话。

我原本打算保留一个节点的数组列表,但后来我意识到所有节点都需要有自己的线程。

我的问题是如何在 Java 的线程之间向前传递信息。我需要能够让主节点提供所有常规节点的位置信息。我需要常规节点能够将消息传递给他们的邻居常规节点。?

如果你想看看我现在开始的代码,这里是我的 git repos。

https://github.com/fieldju/cs372_project

在 CI 中制作了一个程序,该程序使用管道让孩子相互交谈,服务器连接客户端,但在这个问题中,节点要进行 p2p 通信,因为它们中的大多数不能直接与主节点/服务器通信


对于任何查看此内容并希望查看结果的人来说,这只是一个更新。我让节点启动并运行并进行通信,您可以在以下位置查看代码

https://github.com/fieldju/cs372_project

我仍在研究距离矢量的东西和其他一些事情,但到下周末,整个事情都应该完成。

4

3 回答 3

4

我原本打算保留一个节点的数组列表,但后来我意识到所有节点都需要有自己的线程。

您可以保留一个线程数组,它仍然会为每个节点维护一个具有相同逻辑结构的线程。

如何在 Java 中的线程之间向前传递信息。

如果线程驻留在同一个进程中,那么套接字肯定是一种矫枉过正。我会使用一个或多个ConcurrentLinkedQueue实例来推送/弹出消息。

一个或几个实际上取决于您正在实施的通信类型。每个节点可能有一个 ConcurrentLinkedQueue,因此节点将消息推送到队列,每个节点都知道从哪里弹出消息。

实施的一些提示

将所有用于在类中传递消息的逻辑封装起来——让我们称之为这个类VirtualNetworkVirtualNetwork处理 ConcurrentLinkedQueue 的所有实例,并为所有线程提供用于发送/接收消息的方法 API。VirtualNetwork通过在 Thread 构造函数上传递对它的引用,使所有节点都可以访问该类的一个实例。

这是你的班级的草图NodeThread。请注意,类VirtualNetworkMessage是您必须实现自己的类。

class NodeThread extends Thread {

    private int nodeId;
    private VirtualNetwork network;

    public NodeThread(int nodeId,VirtualNetwork network) {
        this.network = network;
        this.nodeId = nodeId;
    }
    public void run() {
        /* when you have to send */
        int nodeReceptor = this.nodeId -1; /* neighbor in the array of threads */
        Message m = new Message(this.nodeId,nodeReceptor);
        m.setContent(10);
        network.send(m);

        /* when you have to receive */
        Message m = network.receive(this.nodeId);
        /* it's your decision to implement this in a blocking way or not */
    }
} 
于 2011-05-25T18:56:15.353 回答
1

一种简单(如果不是最佳)的开始方法是为BlockingQueue需要在一个方向传递值的每对线程创建一个(如果它是双向的,则需要两倍的数量。)

于 2011-05-25T19:13:36.807 回答
0

你绝对可以使用Sockets这里这里有几个教程/描述。您对项目的描述表明客户端/服务器设置会很好,因为您有一个中央“主节点”。主服务器将成为服务器,其他线程将能够连接到主服务器/服务器以接收它们的更新。

于 2011-05-25T18:52:46.240 回答