99import java .util .*;
1010import io .github .javaherobrine .*;
1111import io .github .javaherobrine .net .*;
12+ import io .github .javaherobrine .net .speed .*;
1213@ SuppressWarnings ("serial" )
1314public 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