📄 csma.java
字号:
/*
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 + -