问题描述
|
因此,我是Java的新手,我做了一些c编程。
我试图建立一个虚拟的节点网络,每个节点都需要一个线程。
只允许节点与它们的邻居节点通话。
将有一个可以与任何节点对话的主节点,但是这些节点必须彼此对话才能返回到该主节点。邻居可以与主节点对话。
我本来打算保留节点的数组列表,但是后来我意识到所有节点都需要有自己的线程。
我的问题是如何在Java线程之间向前传递信息。
我需要能够使主节点为所有常规节点提供位置信息。
并且我需要常规节点能够将消息传递到其邻居常规节点。
这是我的git仓库,如果您想看看我现在要去的代码。
https://github.com/fieldju/cs372_project
在C语言中,我编写了一个程序,该程序使用管道让孩子们互相交谈,并且服务器连接了客户端,但是在这个问题中,要进行p2p通信的节点大部分都无法直接与主节点/服务器进行通信。
只是对那些希望查看结果的人的更新。我启动了节点并开始运行并进行通信,您可以在以下位置检查代码
https://github.com/fieldju/cs372_project
我仍在研究距离矢量的东西和其他一些东西,但是到下周结束时,整个事情都应该完成。
解决方法
我原本打算保持
节点的数组列表,但是我
意识到需要将所有节点
有自己的线程。
您可以保留一个线程数组,它仍将维护具有相同逻辑结构的每个节点线程。
我该如何传递信息
在Java中的线程之间转发。
如果线程驻留在同一进程中,那么套接字肯定是一个过大的杀伤力。我将使用一个或多个ConcurrentLinkedQueue实例来推送/弹出消息。
一个或几个真正取决于您所实现的通信类型。也许每个节点一个ConcurrentLinkedQueue,所以节点将消息推送到队列,每个节点都知道从何处弹出消息。
实施的一些提示
总结所有逻辑以在一个类中路由消息-我们将此类称为“ 0”。 “ 0”处理ConcurrentLinkedQueue的所有实例,并为所有线程提供用于发送/接收消息的方法的API。使“ 0”类的一个实例可被所有节点访问-通过在Thread构造函数上传递对该类的引用。
这是class3 class班的概况。注意,类
VirtualNetwork
和Message
是必须实现自己的类。
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 */
}
}
,一种简单的(如果不是最佳的)开始方式是为需要在一个方向上传递值的每对线程创建一个BlockingQueue
(如果它是双向的,则需要两倍的值)。
,您肯定可以使用套接字。这里和这里都有一些教程/说明。您对项目的描述表明,由于您具有中央的“主节点”,因此客户机/服务器设置会很好地工作。主服务器将是服务器,其他线程将能够连接到主服务器/服务器以接收其更新。