-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStation.java
More file actions
114 lines (100 loc) · 5.39 KB
/
Station.java
File metadata and controls
114 lines (100 loc) · 5.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;
public class Station {
private static final int MAX_BUFFER_SIZE = 5; // Μέγιστο μέγεθος buffer
private String name;
private int id;
private Queue<Packet> buffer; // Ουρά για την κράτηση πακέτων
private Random random; // Γεννήτρια τυχαίων αριθμών για την πιθανότητα μετάδοσης
private String wavelength; // Το μήκος κύματος που χρησιμοποιεί αυτός ο σταθμός
private int totalDelay; // Συνολική καθυστέρηση όλων των μεταδιδόμενων πακέτων
private int packetsSent; // Συνολικός αριθμός πακέτων που εστάλησαν με επιτυχία
private int packetsLost; // Συνολικός αριθμός απορριφθέντων πακέτων
public Station(String name, int id, String wavelength) {
this.name = name;
this.id = id;
this.wavelength = wavelength;
this.buffer = new LinkedList<>();
this.random = new Random();
this.totalDelay = 0;
this.packetsSent = 0;
this.packetsLost=0;
}
/**
* Προσομοιώνει τη μετάδοση πακέτων από ένα buffer με πιθανότητα 50%.
* Για κάθε κλήση, η μέθοδος ελέγχει αν ο buffer δεν είναι άδειος. Εάν υπάρχει ένα πακέτο,
* έχει 50% πιθανότητα να μεταδοθεί στην τρέχουσα time slot. Εάν το πακέτο
* μεταδίδεται, ο χρόνος μετάδοσής του ορίζεται στην τρέχουσα χρονοθυρίδα και η παράδοσή του
* ορίζεται στην επόμενη χρονοθυρίδα. Στη συνέχεια, το πακέτο αφαιρείται από το buffer. Ο
* συνολικός αριθμός των πακέτων που έχουν αποσταλεί και η συνολική καθυστέρηση ενημερώνονται αναλόγως. Εάν το
* πακέτο δε μεταδοθεί, παραμένει στο buffer για πιθανή μετάδοση σε μια
* µελλοντική χρονοθυρίδα.
*
* @param currentTimeSlot Η τρέχουσα χρονοθυρίδα στην οποία επιχειρείται η μετάδοση.
*/
public void transmitPackets(int currentTimeSlot) {
if (!buffer.isEmpty()) {
Packet packet = buffer.peek();
if (random.nextDouble() < 0.5) {
packet.setTransmissionTime(currentTimeSlot);
packet.setDeliveryTime(currentTimeSlot + 1);
//System.out.println("Transmitting packet: " + packet.getName());
buffer.poll(); // Αφαίρεση του πακέτου από την ουρά μετά την επιτυχή μετάδοση
packetsSent++;
totalDelay += (currentTimeSlot - packet.getArrivalTime()); // Αύξηση της συνολικής καθυστέρησης
} else {
//System.out.println("Failed to transmit packet: " + packet.getName());
//System.out.println("Transmission collision for packet: " + buffer.peek().getName());
}
}
}
/**
* Προσθέτει ένα πακέτο στο buffer αν υπάρχει διαθέσιμος χώρος.
* Όταν φτάνει ένα πακέτο, αυτή η μέθοδος ελέγχει αν ο buffer δεν έχει φτάσει στο μέγιστο όριο
* χωρητικότητας. Αν υπάρχει διαθέσιμος χώρος, ορίζεται ο χρόνος άφιξης του πακέτου και το
* πακέτο προστίθεται στο buffer. Εάν ο buffer είναι γεμάτος, το πακέτο δεν προστίθεται και
* θεωρείται χαμένο. Ο αριθμός των χαμένων πακέτων αυξάνεται σε αυτή την περίπτωση.
*
* @param packet Το πακέτο που πρέπει να προστεθεί στο buffer.
* @param arrivalTime Ο χρόνος άφιξης του πακέτου.
*/
public void addPacket(Packet packet, int arrivalTime) {
if (buffer.size() < MAX_BUFFER_SIZE) {
packet.setArrivalTime(arrivalTime);
buffer.offer(packet);
//System.out.println("Added packet to buffer: " + packet.getName());
} else {
packetsLost++;
//System.out.println("Buffer is full. Dropping packet: " + packet.getName());
}
}
// Getters and Setters
public int getTotalDelay() {
return totalDelay;
}
public int getPacketsSent() {
return packetsSent;
}
public int getPacketsLost() {
return packetsLost;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWavelength() {
return wavelength;
}
public void setWavelength(String wavelength) {
this.wavelength=wavelength;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}