Skip to content

Commit fe68bf0

Browse files
committed
Packet losser in UDP Debugger
1 parent 5041dcf commit fe68bf0

File tree

2 files changed

+73
-7
lines changed

2 files changed

+73
-7
lines changed

io/github/javaherobrine/net/speed/PacketLosser.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
import java.net.DatagramSocket;
44
import java.io.IOException;
55
import java.net.DatagramPacket;
6+
import io.github.javaherobrine.EventDispatchThread;
7+
import io.github.javaherobrine.net.SendDatagramEvent;
68
/*
79
* Used to simulate UDP packet loss
810
*/
911
public class PacketLosser {
1012
private static final Random entropy=new Random(System.currentTimeMillis());
1113
public static void send(DatagramSocket socket,DatagramPacket packet,double loss) throws IOException {
12-
if(entropy.nextDouble(0, 1)<loss) {//packet loss
14+
if(entropy.nextDouble(0, 1)>loss) {
1315
socket.send(packet);
14-
}
16+
}//packet loss
1517
}
1618
public static void recv(DatagramSocket socket,DatagramPacket packet,double loss) throws IOException {
1719
while(true) {
@@ -22,4 +24,9 @@ public static void recv(DatagramSocket socket,DatagramPacket packet,double loss)
2224
//packet loss
2325
}
2426
}
27+
public static void sendAsync(SendDatagramEvent data,EventDispatchThread edt,double loss) {
28+
if(entropy.nextDouble(0,1)>loss) {
29+
edt.put(data);
30+
}
31+
}
2532
}

io/github/javaherobrine/net/ui/DatagramSocketUI.java

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.*;
1010
import io.github.javaherobrine.*;
1111
import io.github.javaherobrine.net.*;
12+
import io.github.javaherobrine.net.speed.*;
1213
@SuppressWarnings("serial")
1314
public class DatagramSocketUI extends JFrame implements Runnable{
1415
private byte[] currentData;
@@ -26,6 +27,7 @@ public class DatagramSocketUI extends JFrame implements Runnable{
2627
private OutOfLength proc=OutOfLength.DISCARD;
2728
private final Dimension SIZE=new Dimension(595,85);
2829
private DataDialog dataView=new DataDialog(this);
30+
private double sendLoss=0,recvLoss=0;
2931
/*
3032
* They are all callbacks, too
3133
* Why is Java so Object-Oriented???
@@ -45,7 +47,7 @@ public class DatagramSocketUI extends JFrame implements Runnable{
4547
case OutOfLength.DISCARD:
4648
byte[] temp=new byte[MSS];
4749
System.arraycopy(b,0,temp,0,MSS);
48-
EDT.put(new SendDatagramEvent(socket,remote,b));
50+
PacketLosser.sendAsync(new SendDatagramEvent(socket,remote,b),EDT,sendLoss);
4951
b=temp;
5052
if(displaySend) {
5153
displayData(b,socket.getLocalSocketAddress(),remote,true);
@@ -54,15 +56,15 @@ public class DatagramSocketUI extends JFrame implements Runnable{
5456
case OutOfLength.SEND:
5557
SendDatagramEvent[] events=SendDatagramEvent.split(socket,remote,b, MSS);
5658
for(int j=0;j<events.length;++j) {
57-
EDT.put(events[j]);
59+
PacketLosser.sendAsync(events[j],EDT,sendLoss);
5860
if(displaySend) {
5961
displayData(events[j].data(),socket.getLocalSocketAddress(),events[j].remote(),true);
6062
}
6163
}
6264
break;
6365
case OutOfLength.QUEUE:
6466
SendDatagramEvent[] events0=SendDatagramEvent.split(socket,remote,b,MSS);
65-
EDT.put(events0[0]);
67+
PacketLosser.sendAsync(events0[0],EDT,sendLoss);
6668
if(displaySend) {
6769
displayData(events0[0].data(),socket.getLocalSocketAddress(),events0[0].remote(),true);
6870
}
@@ -72,7 +74,7 @@ public class DatagramSocketUI extends JFrame implements Runnable{
7274
break;
7375
}
7476
}else {
75-
EDT.put(new SendDatagramEvent(socket, remote, b));
77+
PacketLosser.sendAsync(new SendDatagramEvent(socket,remote,b),EDT,sendLoss);
7678
if(displaySend) {
7779
displayData(b,socket.getLocalSocketAddress(),remote,true);
7880
}
@@ -404,9 +406,66 @@ public void windowDeactivated(WindowEvent e) {}
404406
size.addActionListener(n->{
405407
sizeDialog.setVisible(true);
406408
});
409+
JMenuItem losser=new JMenuItem("Datagram Loss Emulator");
410+
//Dialog begin
411+
JDialog lDialog=new JDialog(this,"the RPM Package Manager",true);
412+
JPanel lNorth=new JPanel();
413+
lNorth.setLayout(new FlowLayout());
414+
JPanel lSouth=new JPanel();
415+
lSouth.setLayout(new FlowLayout());
416+
lDialog.setLayout(new BorderLayout());
417+
JTextField up=new JTextField("0");
418+
JTextField down=new JTextField("0");
419+
up.setColumns(8);
420+
down.setColumns(8);
421+
lNorth.add(new JLabel("P(Uplink\'s datagram loss)="));
422+
lNorth.add(up);
423+
lSouth.add(new JLabel("P(Downlink\'s datagram loss)="));
424+
lSouth.add(down);
425+
lDialog.add(lNorth,BorderLayout.NORTH);
426+
lDialog.add(lSouth,BorderLayout.SOUTH);
427+
lDialog.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
428+
lDialog.addWindowListener(new WindowListener() {
429+
@Override
430+
public void windowOpened(WindowEvent e) {}
431+
@Override
432+
public void windowClosing(WindowEvent e) {
433+
double uL=0,dL=0;
434+
try {
435+
uL=Double.parseDouble(up.getText());
436+
dL=Double.parseDouble(down.getText());
437+
}catch(NumberFormatException e1) {
438+
JOptionPane.showMessageDialog(lDialog,"I\'d like to tell your Probability Theory professor about thus","Illegal Input",JOptionPane.ERROR_MESSAGE);
439+
return;
440+
}
441+
if(uL<0||dL<0||uL>1||dL>1) {
442+
JOptionPane.showMessageDialog(lDialog,"I\'d like to tell your Probability Theory professor about thus","Illegal Input",JOptionPane.ERROR_MESSAGE);
443+
return;
444+
}
445+
sendLoss=uL;
446+
recvLoss=dL;
447+
lDialog.dispose();
448+
}
449+
@Override
450+
public void windowClosed(WindowEvent e) {}
451+
@Override
452+
public void windowIconified(WindowEvent e) {}
453+
@Override
454+
public void windowDeiconified(WindowEvent e) {}
455+
@Override
456+
public void windowActivated(WindowEvent e) {}
457+
@Override
458+
public void windowDeactivated(WindowEvent e) {}
459+
});
460+
lDialog.pack();
461+
//Dialog end
462+
losser.addActionListener(n->{
463+
lDialog.setVisible(true);
464+
});
407465
network.add(upload);
408466
network.add(size);
409467
network.add(showQueue);
468+
network.add(losser);
410469
bar.add(network);
411470
JMenu about=new JMenu("About");
412471
JMenuItem license=new JMenuItem("License");
@@ -463,7 +522,7 @@ public void run() {
463522
while(!socket.isClosed()) {
464523
try {
465524
DatagramPacket packet=new DatagramPacket(new byte[65528],65528);
466-
socket.receive(packet);
525+
PacketLosser.recv(socket,packet,recvLoss);
467526
byte[] data=new byte[packet.getLength()];
468527
System.arraycopy(packet.getData(),0,data,0,packet.getLength());
469528
displayData(data,packet.getSocketAddress(),socket.getLocalSocketAddress(),false);

0 commit comments

Comments
 (0)