⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csma.java

📁 cdma-cd的java源代码cdma-cd的java源代码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:


/* 

Simulation of CSMA done by B.Anuradha ,C.Manoj Kumar,T.Chitti Babu

done as a part of the course Distributed Systems offered by Dr. Sridhar Iyer,IIT BOMBAY.

*/



import java.applet.*;

import java.awt.*;

import java.awt.image.*;

import java.lang.Math;

import java.util.Random;







class Timer extends Thread {

  

  public  int myTime = 0;

  public static int myTime1 = 0;

  Network myNetwork;

  Component myComponent;

  int myInterval;



  void setTime(int value)

  {

  	myTime = value;

  }

    

  void sleep(int time) 

  {

    try { 

      Thread.sleep(time); 

       } 

    catch (InterruptedException e)

     {

      

     }

   }



  public Timer(Network network, Component component, int interval) {

    myNetwork = network;

    myComponent = component;

    myInterval = interval;

   

  }



  public void run() 

  {

    while (true) 

    {	

      myNetwork.update();

      myComponent.repaint();

      sleep(myInterval);

	   myTime++;

    }

  } 

}







class Counter {



  int myCount;

  

  public Counter( int start ) 

  {

    myCount = start;

  }



  public void decrement() 

  {

    myCount--;

    return;

  }



  public void increment() 

  {

    myCount++;

    return;

  }



  public int getCount() 

  {

    return myCount;

  }



  public void setCount(int count) 

  {

    myCount = count;

  }



}



/* the left and right parts of a signal are simualated */



class Part {



  Medium myMedium;



  int myMaxFrameSize;

  int myLength;



  int myOffset;

  int myStart;

  int myEnd;



  public boolean myDoneFlag;



  boolean myCollisionFlag;



  public Part( int start, int end, int offset, int frameSize, Medium medium ) 

  {

    myStart = start;

    myEnd = end;

    myOffset = offset;

    myCollisionFlag = false;

    myMaxFrameSize = frameSize;

    myMedium = medium;

    myLength = 0;

    myDoneFlag = false;

  }



  void setCollisionFlag( boolean flag ) 

  {

    myCollisionFlag = flag;

  }



  boolean getCollisionFlag() 

  {

    return myCollisionFlag;

  }



  boolean getDoneFlag() 

  {

    return myDoneFlag;

  }



  int getStart() 

  {

    return myStart;

  }



  int getEnd() 

  {

    return myEnd;

  }



  boolean isSent() 

  {

    return (myLength > myMaxFrameSize);

  }



  public void update() 

  {



    if (myLength>0 && myStart==myEnd) 

    {

      myDoneFlag=true;

      return;

    }

    myLength = myLength + Math.abs(myOffset);

    myStart = myStart + myOffset;

    if ( myLength > myMaxFrameSize )

       myEnd = myEnd + myOffset;



    if (myStart<0) 

      myStart = 0;



    if (myStart>myMedium.getBusLength() )//ACTULLY buslength=100

      myStart = myMedium.getBusLength();



    if (myEnd<0) 

      myEnd = 0;



    if (myEnd>myMedium.getBusLength() )

      myEnd = myMedium.getBusLength();



  }



}



/* the various kinds of (messages for transmission) signals are simulated here */

class Signal 

{

  

  Part myLeftPart;

  Part myRightPart;

  

  int myStationId;



  int getStationId() 

  {

    return myStationId;

  }

	public void setIdle()

	{

		myLeftPart.myDoneFlag=true;

		myRightPart.myDoneFlag=true;

	}

  Part getLeftPart() 

  {

    return myLeftPart;

  }



  Part getRightPart() 

  {

    return myRightPart;

  }



  public Signal(int stationId, int position, int frameSize, Medium medium) 

  {

    myStationId = stationId;

    myLeftPart = new Part(position,position,-1,frameSize,medium);

    myRightPart = new Part(position,position, 1,frameSize,medium);

  }



  public void update() 

  {

    myLeftPart.update();

    myRightPart.update();    

  }



  public boolean isDone() 

  {

    return myLeftPart.getDoneFlag() && myRightPart.getDoneFlag();

  }



  public boolean isCollision() 

  {

    return myLeftPart.getCollisionFlag() || myRightPart.getCollisionFlag();

  }



  boolean isSent() 

  {

    return myLeftPart.isSent() && myRightPart.isSent();

  }





}



/* the medium class which simulates the medium(-bus) */

class Medium {

  

 

  int myBusLength        = 100;	        // in meters

  

  public static final int MAX_SIGNALS = 10;





  Signal[] mySignals;



  boolean isInInterval(int value, int start, int end) 

  {

    if ( (value>=Math.min(start,end))&&(value<=Math.max(start,end)) )

      return true;

    else

      return false;

  }

	

  public void setMediumIdle()

  {

 		for(int j=0;j<10;j++)

		 if(mySignals[j]!=null)

		 	mySignals[j].setIdle();

			  

  }	

  public Medium() 

  {    

    mySignals = new Signal[MAX_SIGNALS];    

  }



  public int getBusLength() 

  {

    return myBusLength;

  }



  Signal[] getSignals() 

  {

    return mySignals;

  }

  



  public boolean isCollision(int station, int position) 

  {

    int index;

    for ( index=0; index<MAX_SIGNALS; index++ ) 

    {

      if ( (mySignals[index] != null) && (mySignals[index].getStationId()!=station) ) 

      {

        if ( isInInterval( position, mySignals[index].getLeftPart().getStart(), 

			   mySignals[index].getLeftPart().getEnd() ) ) 

			   {

          if ( mySignals[index].getLeftPart().getCollisionFlag() == true ) 

          {

            return true;

          }

        }

        if ( isInInterval( position, mySignals[index].getRightPart().getStart(),

			    mySignals[index].getRightPart().getEnd() ) ) {

          if ( mySignals[index].getRightPart().getCollisionFlag() == true ) {

            return true;

          }

        }        

      }

    }



    return false;

  }



  public boolean isFree(int position) {



    int index;



    for ( index=0; index<MAX_SIGNALS; index++ ) {

      if ( mySignals[index] != null ) {

        if ( isInInterval( position, mySignals[index].getLeftPart().getStart(), 

			   mySignals[index].getLeftPart().getEnd() ) ) {

          return false;

        }

        if ( isInInterval( position, mySignals[index].getRightPart().getStart(), 

			   mySignals[index].getRightPart().getEnd() ) ) {

          return false;

        }

        

        return true;

      }

    }



    return true;

  }



  void sleep(int time) {

    try { 

      Thread.sleep(time); 

    } 

    catch (InterruptedException e) {

      

    }

  }



  public boolean send( int station, int position, int frameSize) {



    int index;



    for ( index=0; index<MAX_SIGNALS; index++ ) {

      if ( mySignals[index] == null ) {

        

        mySignals[index] = new Signal( station, position, frameSize, this);



        while(true) {

          if ( mySignals[index].isSent() ) {

            return true;

          }          

          if ( isCollision(station, position) ) {

            return false;

          }          

          sleep(50);

        }

      }

    }



    return false;

  }



  public void update() {



    int i,j; 

    int start,end, id;



    

    // update signals

    for ( i=0; i<MAX_SIGNALS; i++ ) {

      if ( mySignals[i] != null ) {        

        mySignals[i].update();

          if ( mySignals[i].isDone() ) {

            mySignals[i] = null;

          }

      }

    }



    // find collisions

    for ( i=0; i<MAX_SIGNALS; i++ ) {

      if ( mySignals[i] != null ) {        

        id    = mySignals[i].getStationId();



        start = mySignals[i].getLeftPart().getStart();

        end   = mySignals[i].getLeftPart().getEnd();



        for ( j=0; j<MAX_SIGNALS; j++ ) {

          if ( (mySignals[j] != null) && (mySignals[j].getStationId() != id)) {



            if ( isInInterval( mySignals[j].getLeftPart().getStart(), start, end ) ) {

              mySignals[i].getLeftPart().setCollisionFlag(true);

              if (!mySignals[i].getRightPart().isSent())

                {

                mySignals[i].getRightPart().setCollisionFlag(true);

                mySignals[j].getLeftPart().setCollisionFlag(true);

						}

              break;

            }

            if ( isInInterval( mySignals[j].getLeftPart().getEnd(), start, end ) ) {

              mySignals[i].getLeftPart().setCollisionFlag(true);

              if (!mySignals[i].getRightPart().isSent())

               {

                mySignals[i].getRightPart().setCollisionFlag(true);

                 mySignals[j].getLeftPart().setCollisionFlag(true);

					}

              break;

            }

            if ( isInInterval( mySignals[j].getRightPart().getStart(), start, end ) ) {

              mySignals[i].getLeftPart().setCollisionFlag(true);

              if (!mySignals[i].getRightPart().isSent())

                {

                mySignals[i].getRightPart().setCollisionFlag(true);

               mySignals[j].getLeftPart().setCollisionFlag(true);

					}

              break;

            }

            if ( isInInterval( mySignals[j].getRightPart().getEnd(), start, end ) ) {

              mySignals[i].getLeftPart().setCollisionFlag(true);

              if (!mySignals[i].getRightPart().isSent())

               {

                mySignals[i].getRightPart().setCollisionFlag(true);

               mySignals[j].getLeftPart().setCollisionFlag(true);

					}

					break;

            }

          }

        }



        start = mySignals[i].getRightPart().getStart();

        end   = mySignals[i].getRightPart().getEnd();



        for ( j=0; j<MAX_SIGNALS; j++ ) {

          if ( (mySignals[j] != null) && (mySignals[j].getStationId() != id)) {



            if ( isInInterval( mySignals[j].getLeftPart().getStart(), start, end ) ) {

              mySignals[i].getRightPart().setCollisionFlag(true);

              if (!mySignals[i].getLeftPart().isSent())

               {

                mySignals[i].getLeftPart().setCollisionFlag(true);



               mySignals[j].getRightPart().setCollisionFlag(true);

					}

              	break;

            }

            if ( isInInterval( mySignals[j].getLeftPart().getEnd(), start, end ) ) {

              mySignals[i].getRightPart().setCollisionFlag(true);

              if (!mySignals[i].getLeftPart().isSent())

                {

                mySignals[i].getLeftPart().setCollisionFlag(true);

                             mySignals[j].getRightPart().setCollisionFlag(true);

}					break;

            }

            if ( isInInterval( mySignals[j].getRightPart().getStart(), start, end ) ) {

              mySignals[i].getRightPart().setCollisionFlag(true);

              if (!mySignals[i].getLeftPart().isSent())

               {

                mySignals[i].getLeftPart().setCollisionFlag(true);

                             mySignals[j].getRightPart().setCollisionFlag(true);

              }

              break;

            }

            if ( isInInterval( mySignals[j].getRightPart().getEnd(), start, end ) ) {

              mySignals[i].getRightPart().setCollisionFlag(true);

              if (!mySignals[i].getLeftPart().isSent())

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            {

                mySignals[i].getLeftPart().setCollisionFlag(true);

                            mySignals[j].getRightPart().setCollisionFlag(true);

		} break;

            }

          }

        }



      }

    }

  



  }



}



/*

 *

 */

class Station extends Thread {



	public static final int IDLE = 0;

	public static final int CARRIER_SENSE = 1;

	public static final int TRANSMIT = 2;

	public static final int BACKOFF = 3;





  Counter myCounter;



  Medium myMedium;

  Network myNetwork;



  int myBackoffCount;



  int myPosition;

  int myState;

  int myId;



  Random myRandom;





  boolean mySendRequest;



  public Station(int id, int position, Network network, Medium medium) {

    myPosition = position;

    myMedium = medium;

    myNetwork = network;

    myId = id;

    myState = IDLE;

    mySendRequest = false;

    myRandom = new Random(this.hashCode());

    this.start();

  }



  public void setSendRequest( boolean flag ) {

    mySendRequest = flag;

  }



  public int getState() {

    return myState;

  }



  public void setState(int x)

  {

  		myState=x;

  }

  

  public int getBackoffCount() {

    return myBackoffCount;

  }



  public int getBackoffRemain() {

    return myCounter.getCount();

  }



  public int getPosition() {

    return myPosition;

  }



  void sleep(int time) {

    try { 

      Thread.sleep(time); 

    } 

    catch (InterruptedException e) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -