simparamudp.java
来自「一个小型网络仿真器的实现」· Java 代码 · 共 283 行
JAVA
283 行
/*
JaNetSim --- Java Network Simulator
-------------------------------------
This software was developed at the Network Research Lab, Faculty of
Computer Science and Information Technology (FCSIT), University of Malaya.
This software may be used and distributed freely. FCSIT assumes no responsibility
whatsoever for its use by other parties, and makes no guarantees, expressed or
implied, about its quality, reliability, or any other characteristic.
We would appreciate acknowledgement if the software is used.
FCSIT ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND
DISCLAIM ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING
FROM THE USE OF THIS SOFTWARE.
*/
package janetsim.component;
import janetsim.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
public class SimParamUDP extends SimParameter implements ActionListener,
UDPProvider,java.io.Serializable {
private UDP udp;
private double udp_delay=0;
private double udp_delayvar=0;
private transient JComponent jcomp=null;
private transient SimDialog ctableDialog=null;
private transient JTable table=null;
public SimParamUDP(String aName,SimComponent comp,long creationTick) {
super(aName,comp,creationTick,false);
udp=new UDP(comp,this);
}
////////////// possible overrides //////////////////////////
public JComponent getJComponent() {
if(jcomp==null) {
jcomp=new JButton("Details...");
((JButton)jcomp).setHorizontalAlignment(JButton.LEFT);
((JButton)jcomp).addActionListener(this);
}
return jcomp;
}
////////////// services /////////////////////////////////////
public void reset() {
udp.reset();
}
public void receive_ip(IPPacket packet,SimComponent fromlink) {
udp.receive_ip(packet,fromlink);
}
public UDP getUDP() {
return udp;
}
////////////// tcp provider /////////////////////////////////////
public double getDelay() {
return udp_delay;
}
public double getDelayVar() {
return udp_delayvar;
}
public void sendPacket(IPPacket packet) {
getOwner().compInfo(SimProvider.CI_TRANSPORT_SEND,null,packet);
}
public void sendPacket(IPPacket packet,SimComponent tolink) {
Object [] parms=new Object[2];
parms[0]=packet;
parms[1]=tolink;
getOwner().compInfo(SimProvider.CI_TRANSPORT_SEND2LINK,null,parms);
}
public void statusChanged() {
//refresh the table if visible
if(ctableDialog!=null) {
table.revalidate();
ctableDialog.repaint();
}
}
////////////// private /////////////////////////////////////
private class PropDialogListener implements ActionListener {
JDialog dialog=null;
JTextField txtDelay, txtDelayvar;
JButton btnOK, btnCancel;
public void actionPerformed(ActionEvent e) {
if(e.getSource()==btnOK) {
double newdelay=0,newvar=0;
try {
newdelay=Double.parseDouble(txtDelay.getText().trim());
if(newdelay<0) throw new NumberFormatException();
} catch(NumberFormatException ex) {
JOptionPane.showMessageDialog(theGUI.getMainFrame(),"Delay not valid!",
"Error",JOptionPane.INFORMATION_MESSAGE);
txtDelay.requestFocus();
return;
}
try {
newvar=Double.parseDouble(txtDelayvar.getText().trim());
if(newvar<0) throw new NumberFormatException();
} catch(NumberFormatException ex) {
JOptionPane.showMessageDialog(theGUI.getMainFrame(),"Delay variation not valid!",
"Error",JOptionPane.INFORMATION_MESSAGE);
txtDelayvar.requestFocus();
return;
}
udp_delay=newdelay;
udp_delayvar=newvar;
dialog.dispose();
}
else {
dialog.dispose();
}
}
}
private class DialogListener implements ActionListener,
ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
}
public void actionPerformed(ActionEvent e) {
String command=e.getActionCommand();
if(command.equals("UDP Properties...")) {
PropDialogListener listener=new PropDialogListener();
listener.dialog=new JDialog(theGUI.getMainFrame(),"UDP Properties",true);
listener.dialog.getContentPane().setLayout(new GridLayout(3,1));
JPanel aPanel=new JPanel();
aPanel.add(new JLabel("Processing delay (usecs):"));
aPanel.add(listener.txtDelay=new JTextField(String.valueOf(udp_delay),7));
listener.dialog.getContentPane().add(aPanel);
aPanel=new JPanel();
aPanel.add(new JLabel("Delay variation (usecs):"));
aPanel.add(listener.txtDelayvar=new JTextField(String.valueOf(udp_delayvar),7));
listener.dialog.getContentPane().add(aPanel);
aPanel=new JPanel();
aPanel.add(listener.btnOK=new JButton("OK"));
aPanel.add(listener.btnCancel=new JButton("Cancel"));
listener.dialog.getContentPane().add(aPanel);
listener.dialog.getRootPane().setDefaultButton(listener.btnOK);
listener.btnOK.addActionListener(listener);
listener.btnCancel.addActionListener(listener);
listener.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
listener.dialog.pack();
Dimension ddim=listener.dialog.getPreferredSize();
Dimension sdim=Toolkit.getDefaultToolkit().getScreenSize();
listener.dialog.setLocation((sdim.width-ddim.width)/2,(sdim.height-ddim.height)/2);
listener.dialog.show();
}
else if(command.equals("Close")) {
ctableDialog.dispose();
}
}
}
//helper for monitoring changes in the simulation (e.g. to refresh table)
private void checkLinks() {
//check if the owner is still there...
if(!getOwner().getSim().getSimComponents().contains(getOwner())) {
if(ctableDialog!=null) ctableDialog.dispose();
}
}
//the table model
private class MyTableModel extends javax.swing.table.AbstractTableModel {
public int getRowCount() {
return udp.connectionCount();
}
public int getColumnCount() {
return 4;
}
public Object getValueAt(int row,int col) {
int valueip;
String ip;
switch(col) {
case 0:
valueip=udp.queryUDB_srcip(row);
ip=String.valueOf((valueip>>24)&0xff)+".";
ip+=String.valueOf((valueip>>16)&0xff)+".";
ip+=String.valueOf((valueip>>8)&0xff)+".";
ip+=String.valueOf(valueip&0xff);
return ip;
case 1:
return String.valueOf(udp.queryUDB_srcport(row));
case 2:
valueip=udp.queryUDB_destip(row);
ip=String.valueOf((valueip>>24)&0xff)+".";
ip+=String.valueOf((valueip>>16)&0xff)+".";
ip+=String.valueOf((valueip>>8)&0xff)+".";
ip+=String.valueOf(valueip&0xff);
return ip;
case 3:
return String.valueOf(udp.queryUDB_destport(row));
}
return null;
}
public String getColumnName(int col) {
switch(col) {
case 0: return "Source IP";
case 1: return "Source Port";
case 2: return "Dest IP";
case 3: return "Dest Port";
}
return "N/A";
}
}
private JComponent createNewCTableDialog() {
//the listener
DialogListener listener=new DialogListener();
//prepare the table
table=new JTable(new MyTableModel());
JScrollPane scrollPane=new JScrollPane(table);
table.setPreferredScrollableViewportSize(new Dimension(400,100));
table.getSelectionModel().addListSelectionListener(listener);
table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
//prepare buttons panel
JPanel compPanel=new JPanel();
JButton btnProp=new JButton("UDP Properties...");
btnProp.addActionListener(listener);
compPanel.add(btnProp);
JButton btnClose=new JButton("Close");
btnClose.addActionListener(listener);
compPanel.add(btnClose);
//now the outer panel
JPanel outerpane=new JPanel();
GridBagLayout gl=new GridBagLayout();
outerpane.setLayout(gl);
GridBagConstraints gc=new GridBagConstraints();
gc.fill=GridBagConstraints.BOTH;
gc.gridx=0; gc.gridy=0;
gl.setConstraints(compPanel,gc);
outerpane.add(compPanel);
gc.gridy=1; gc.weightx=1; gc.weighty=1;
gl.setConstraints(scrollPane,gc);
outerpane.add(scrollPane);
return outerpane;
}
public void actionPerformed(ActionEvent e) {
if(ctableDialog==null) {
ctableDialog=new SimDialog(theGUI.getMainFrame(),getOwner().getName()
+" - "+getName(),getOwner().getSim(),theGUI) {
public void componentsChanged() { checkLinks(); }
};
ctableDialog.getContentPane().add(createNewCTableDialog());
ctableDialog.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
ctableDialog=null;
}
});
ctableDialog.pack();
Dimension dsize=ctableDialog.getSize();
Dimension scrsize=Toolkit.getDefaultToolkit().getScreenSize();
ctableDialog.setLocation((scrsize.width-dsize.width)/2,(scrsize.height-dsize.height)/2);
ctableDialog.show();
}
else
ctableDialog.requestFocus();
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?