java - 网格模拟 : how to send message among peer nodes through a router?

标签 java grid

我是 Gridsim 的新用户,目前希望将其用于我的工作。我希望通过路由器连接用户(比如 2)。我按照 example01(直接从发件人向收件人发送 pkt),并包含一个路由器,将其与两个用户连接。但我不知道如何通过路由器开始两个实体之间的通信。它返回空值。另一方面,当我使用 link.attach 时,两个用户都会绕过路由器并直接通信。

Example03 工作正常,但将消息从用户发送到资源,但不发送到对等用户。 希望您能帮我解决这个问题。

在这方面的任何帮助将不胜感激。

谢谢。

最佳答案

我找到了解决办法。这是代码:

程序名称:FlowNetEx01.java

package network.flow.example01;

import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import java.util.*;

public class FlowNetEx01
{
    public static void main(String[] args)
    {
        System.out.println("Starting network example ...");

        try
        {
            int num_user = 2;   // number of grid users
            Calendar calendar = Calendar.getInstance();
            boolean trace_flag = false;  // mean trace GridSim events
            System.out.println("Initializing GridSim package");
            GridSim.initNetworkType(GridSimTags.NET_FLOW_LEVEL);
            GridSim.init(num_user, calendar, trace_flag);

            // In this example, the topology is:
            // user(s) --10Mb/s-- r1 --1.5Mb/s-- r2 --10Mb/s-- GridResource(s)

            Router r1 = new FlowRouter("router1", trace_flag);   // router 1
            Router r2 = new FlowRouter("router2", trace_flag);   // router 2

            String sender1 = "user1";
            String receipient1 = "test1";

            // these entities are the senders
            FlowNetUser user1 = new FlowNetUser(sender1, receipient1, 5.0);
            // these entities are the receipients
            FlowTest test1 = new FlowTest(receipient1, sender1);

            // The schedulers are redundent and will be stripped out soon
            FIFOScheduler userSched1 = new FIFOScheduler("NetUserSched_0");
            r1.attachHost(user1, userSched1);

            FIFOScheduler testSched1 = new FIFOScheduler("FlowTestSched_0");
            r2.attachHost(test1, testSched1);

            double baud_rate = 1572864; // bits/sec (baud) [1.5Mb/s]
            double propDelay = 200;   // propagation delay in millisecond
            int mtu = Integer.MAX_VALUE;;    // max. transmission unit in byte

            Link link = new FlowLink("r1_r2_link", baud_rate, propDelay, mtu);
            FIFOScheduler r1Sched = new FIFOScheduler("r1_Sched");
            FIFOScheduler r2Sched = new FIFOScheduler("r2_Sched");
            r1.attachRouter(r2, link, r1Sched, r2Sched);
            GridSim.startGridSimulation();
            System.out.println("\nFinish ...");
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.err.print(e.toString());
            System.out.println("Unwanted errors happen");
        }
    }
} 

程序名称:FlowNetUser.java

package network.flow.example01;

import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import eduni.simjava.*;
import java.util.*;

public class FlowNetUser extends GridSim
{
    private int myID_;          // my entity ID
    private String name_;       // my entity name
    private String destName_;   // destination name
    private int destID_;        // destination id
    private double wait_;       // Delay until I begin sending

    /** Custom tag that denotes sending a message */
    public static final int SEND_MSG = 1;    
    public static final int ACK_MSG = 2;


    /**
     * Creates a new NetUser object
     * @param name      this entity name
     * @param destName  the destination entity's name
     * @param link      the physical link that connects this entity to destName
     * @throws Exception    This happens when name is null or haven't 
     *                      initialized GridSim.
     */
    public FlowNetUser(String name, String destName, Link link, double wait) throws Exception
    {
        super(name, link);

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        this.destName_ = destName;

        // get the waiting time before sending
        this.wait_ = wait;
    }

    public FlowNetUser(String name, String destName, double wait) throws Exception
    {
        // 10,485,760 baud = 10Mb/s
        super(name, new FlowLink(name+"_link",10485760,450,Integer.MAX_VALUE));

        // get this entity name from Sim_entity
        this.name_ = super.get_name();

        // get this entity ID from Sim_entity
        this.myID_ = super.get_id();

        // get the destination entity name
        destName_ = destName;

        // get the waiting time before sending
        this.wait_ = wait;
    }

    /**
     * The core method that handles communications among GridSim entities.
     */
    public void body()
    {
        int packetSize = 524288000;   // packet size in bytes [5MB]
        //int packetSize = 52428800;   // packet size in bytes [50MB]
        //int packetSize = 524288000;   // packet size in bytes [500MB]
        //int packetSize = 5242880000;   // packet size in bytes [5000MB]
        int size = 3;           // number of packets sent
        int i = 0;

        // get the destination entity ID
        this.destID_ = GridSim.getEntityId(destName_);

        //super.sim_pause(this.wait_);
        this.gridSimHold(this.wait_);


        // sends messages over the other side of the link
        for (i = 0; i < size; i++)
        {

            String msg = "Message_" + i;
            IO_data data = new IO_data(msg, packetSize, destID_);
            System.out.println(name_ + ".body(): Sending " + msg +
                ", at time = " + GridSim.clock() );

            // sends through Output buffer of this entity
            super.send(super.output, GridSimTags.SCHEDULE_NOW,
                       GridSimTags.FLOW_SUBMIT, data);

            //super.sim_pause();
            super.sim_pause(10.0);
            //this.gridSimHold((Math.random()*10)+1.0);

        }

        ////////////////////////////////////////////////////////
        // get the ack back
        Object obj = null;
        for (i = 0; i < size; i++)
        {
            // waiting for incoming event in the Input buffer
            obj = super.receiveEventObject();
            System.out.println(name_ + ".body(): Receives Ack for " + obj);
        }         


        // Wait for other FlowNetUser instances to finish
        this.gridSimHold(1000.0);


        super.send(destID_, GridSimTags.SCHEDULE_NOW,
                   GridSimTags.END_OF_SIMULATION);


        ////////////////////////////////////////////////////////
        // shut down I/O ports
        shutdownUserEntity();
        terminateIOEntities();

        System.out.println(this.name_ + ":%%%% Exiting body() at time " +
                           GridSim.clock() );
    }

} // end class

程序名称:FlowTest.java

package network.flow.example01;

import java.util.*;
import gridsim.*;
import gridsim.net.*;
import gridsim.net.flow.*;
import gridsim.util.SimReport;
import eduni.simjava.*;

public class FlowTest extends GridSim
{
    private int myID_;          // my entity ID
    private String name_;       // my entity name
    private String destName_;   // destination name
    private int destID_;        // destination id
    private SimReport report_;  // logs every activity

   public FlowTest(String name, String destName, Link link) throws Exception
    {
        super(name, link);

        this.name_ = super.get_name();
        this.myID_ = super.get_id();
        this.destName_ = destName;
        report_ = new SimReport(name);
        report_.write("Creates " + name);
    }

    public FlowTest(String name, String destName) throws Exception
    {
        super(name, new FlowLink(name+"_link",10485760,250,Integer.MAX_VALUE));
        this.name_ = super.get_name();
        this.myID_ = super.get_id();
        this.destName_ = destName;
        report_ = new SimReport(name);
        report_.write("Creates " + name);
    }

    public void body()
    {
        this.destID_ = GridSim.getEntityId(destName_);
        int packetSize = 1500;   // packet size in bytes
        Sim_event ev = new Sim_event();     // an event

        // a loop waiting for incoming events
        while ( Sim_system.running() )
        {
            // get the next event from the Input buffer
            super.sim_get_next(ev);

            // if an event denotes end of simulation
            if (ev.get_tag() == GridSimTags.END_OF_SIMULATION)
            {
                System.out.println();
                write(super.get_name() + ".body(): exiting ...");
                break;
            }

            // if an event denotes another event type
            else if (ev.get_tag() == GridSimTags.FLOW_SUBMIT)
            {
                System.out.println();
                write(super.get_name() + ".body(): receive " +
                      ev.get_data() + ", at time = " + GridSim.clock());

                // No need for an ack, it is handled in FlowBuffer now on our behalf
                // sends back an ack
                IO_data data = new IO_data(ev.get_data(), packetSize, destID_);
                write(name_ + ".body(): Sending back " +
                      ev.get_data() + ", at time = " + GridSim.clock() );

                // sends through Output buffer of this entity
                super.send(super.output, GridSimTags.SCHEDULE_NOW,
                        GridSimTags.FLOW_ACK, data);

            }

            else if (ev.get_tag() ==  GridSimTags.INFOPKT_SUBMIT)
            {
                processPingRequest(ev);                
            }
        }

        shutdownUserEntity();
        terminateIOEntities();

        // don't forget to close the file
        if (report_ != null) {
            report_.finalWrite();
        }

        System.out.println(this.name_ + ":%%%% Exiting body() at time " +
                           GridSim.clock() );
    }

    /**
     * Handles ping request
     * @param ev    a Sim_event object
     */
    private void processPingRequest(Sim_event ev)
    {
        InfoPacket pkt = (InfoPacket) ev.get_data();
        pkt.setTag(GridSimTags.INFOPKT_RETURN);
        pkt.setDestID( pkt.getSrcID() );

        // sends back to the sender
        super.send(super.output, GridSimTags.SCHEDULE_NOW,
                   GridSimTags.INFOPKT_RETURN,
                   new IO_data(pkt,pkt.getSize(),pkt.getSrcID()) );
    }

    private void write(String msg)
    {
        System.out.println(msg);
        if (report_ != null) {
            report_.write(msg);
        }        
    }

} // end class

关于java - 网格模拟 : how to send message among peer nodes through a router?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33676641/

相关文章:

php - 将信息悬停在缩略图上时显示信息

css - 使用 flexbox 实现这种布局的最佳方式是什么?

javascript - 如何关闭在 jqgrid 中设置默认排序指针?

java - 嵌套模板与新界面相比有何优缺点?

java - 从 domino 使用 JDBC 连接到 DB2

javascript - ASP.NET MVC 应用程序最快的网格组件是什么

javascript - Gridster 的替代品?

java - 将 pdf 文件发送到定义的打印机

java - Android Native Activity 和图形环境

java - Selenium webdriver 页面对象模式和 ExtentReports