📄 client.java
字号:
package code.client;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import jpcap.*;
public class Client
{
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
FrameIO f = new FrameIO();
}
}
class FrameIO extends JFrame implements ActionListener,Runnable
{
Socket ClientSocket;
PrintWriter os;
BufferedReader is;
JLabel dev_pmt; //网卡选择提示框
JComboBox dev_chs; //网卡选择菜单
JPanel dev_Panel; //网卡选择Panel
JLabel ip_pmt; //输入IP地址提示框
JTextField ip_TextField; //输入IP地址文本框
JPanel ip_Panel; //IP输入Panel
JPanel btg_Panel; //按钮组
JPanel input_Panel; //输入Panel
JPanel qita_Panel; //其他信息Panel
JButton btg_con; //连接服务器
JButton btg_ext; //断开服务器
JTextArea state_TextArea; //状态文本框
JScrollPane state_Panel; //状态文本框滚动Panel
String devices[] = Jpcap.getDeviceDescription(); //获取网卡列表
int tmr;
int nmb;
int cmpn;
int ClientCount;
long TimeExcursion;
FrameIO()
{
setTitle("Client Window");
this.addWindowListener(new WinAdptClient(this));
UIManager.put("Button.font",new Font("宋体",Font.PLAIN,12));
UIManager.put("Label.font",new Font("宋体",Font.PLAIN,12));
UIManager.put("Lable.color",new Color(255,0,0));
GridBagConstraints gridBag = new GridBagConstraints();
gridBag.fill = GridBagConstraints.BOTH; //以水平、垂直填充方式布局
dev_pmt = new JLabel("请选择目标网卡:");
dev_chs = new JComboBox();
for(int i=0;i<devices.length;i++)
{
devices[i]=devices[i].replaceAll("\\(Microsoft's Packet Scheduler\\)","");
dev_chs.addItem(devices[i]);
}
dev_chs.addActionListener(this);
dev_chs.setPreferredSize(new Dimension(400,27));//设定大小
dev_Panel = new JPanel(new GridBagLayout());
dev_Panel.setBorder(BorderFactory.createTitledBorder("网卡"));
ip_pmt = new JLabel("请输入服务器端的IP地址或主机名:");
ip_TextField = new JTextField(10);
ip_TextField.addActionListener(this);
ip_Panel = new JPanel(new FlowLayout());
ip_Panel.setBorder(BorderFactory.createTitledBorder("IP"));
ip_Panel.add(ip_pmt);
ip_Panel.add(ip_TextField);
btg_con = new JButton("开始");
btg_ext = new JButton("退出");
btg_con.addActionListener(this);
btg_ext.addActionListener(this);
btg_Panel = new JPanel(new FlowLayout());
btg_Panel.add(btg_con);
btg_Panel.add(btg_ext);
input_Panel = new JPanel(new GridBagLayout());
input_Panel.setBorder(new TitledBorder( new BevelBorder(BevelBorder.LOWERED),"网络设置",TitledBorder.LEFT,TitledBorder.ABOVE_TOP));
qita_Panel =new JPanel();
qita_Panel.setLayout(new FlowLayout());
qita_Panel.setBorder(new TitledBorder( new BevelBorder(BevelBorder.LOWERED),"其他",TitledBorder.LEFT,TitledBorder.ABOVE_TOP));
state_TextArea =new JTextArea();
state_TextArea.setLineWrap(true);
state_Panel =new JScrollPane(state_TextArea);
state_Panel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);//VERTICAL_SCROLLBAR_ALWAYS);
state_Panel.setBorder(new TitledBorder( new BevelBorder(BevelBorder.LOWERED),"状态信息",TitledBorder.LEFT,TitledBorder.ABOVE_TOP));
this.setLayout(new GridBagLayout());
this.add(this,input_Panel,gridBag,0,0,3,1,1,0);
this.add(this,state_Panel,gridBag,1,0,5,3,1,6);
this.add(dev_Panel,dev_pmt,gridBag,0,0,2,1,0,0);
this.add(dev_Panel,dev_chs,gridBag,1,0,5,1,0,0);
this.add(input_Panel,ip_Panel,gridBag,0,0,1,1,1,0);
this.add(input_Panel,dev_Panel,gridBag,1,0,1,1,1,0);
this.add(input_Panel,btg_Panel,gridBag,2,0,1,1,1,0);
this.setResizable(false);
setSize(440,370);
show();
}
public void connect(String Access)
{
try{
Access=Access.replaceAll("\n","");
ClientSocket = new Socket(Access,8000); //连向Server主机的8000端口
Thread ct = new Thread(this);
ct.start();
}catch (Exception e){}
}
public void run()
{
try{
is = new BufferedReader(
new InputStreamReader(ClientSocket.getInputStream()));
os = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(ClientSocket.getOutputStream())),true);
os.println("Hello! Wellcome connect to our server!\r");
os.flush();
String s = is.readLine();
while (!s.equals("Bye"))
{
if(s.indexOf("#CommunicationCommand#")>=0)
{
Command(s);
capture cpt = new capture(tmr,nmb,cmpn,ClientCount,TimeExcursion,dev_chs.getSelectedIndex());
}
else
state_TextArea.append(s+"\n");
if(state_TextArea.getText().equals("!Statr Capture!"));
s = is.readLine(); //读入Client端写入的下一行信息
}
ClientSocket.close(); //若Client端写入"Bye"则结束通信
}catch(Exception e){}
}
public void Command(String cmd)
{
tmr =Integer.parseInt(cmd.substring((cmd.indexOf("时间片大小")+5),cmd.indexOf("\t数据包个数")));
nmb =Integer.parseInt(cmd.substring((cmd.indexOf("数据包个数")+5),cmd.indexOf("\t客户端数量")));
cmpn =Integer.parseInt(cmd.substring((cmd.indexOf("客户端数量")+5),cmd.indexOf("\t客户端序号")));
ClientCount =Integer.parseInt(cmd.substring((cmd.indexOf("客户端序号")+5),cmd.indexOf("\t时间偏移量")));
TimeExcursion =Long.parseLong(cmd.substring((cmd.indexOf("时间偏移量")+5),cmd.indexOf("#END#")));
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btg_con)
connect(ip_TextField.getText());
if(e.getSource()==btg_ext) //捕获数据包
{
System.exit(0);
}
}
private void add(Container cn,Component c,GridBagConstraints gbc,int y,int x,int w,int h,int gx,int gy)
{ //cn为c的容器
gbc.gridx = x; //水平起始位置
gbc.gridy = y; //垂直起始位置
gbc.gridheight = h; //一行单元格数
gbc.gridwidth = w; //一列单元格数
gbc.weightx = gx; //额外的水平空间
gbc.weighty = gy; //额外的垂直空间
cn.add(c, gbc);
}
}
class WinAdptClient extends WindowAdapter
{
FrameIO m_Parent;
WinAdptClient(FrameIO p)
{
m_Parent = p;
}
public void windowClosing(WindowEvent e)
{
try{ //关闭窗口前先向Server端发送结束信息,并关闭各输入输出流与连接
m_Parent.os.println("Bye");
m_Parent.os.flush();
m_Parent.is.close();
m_Parent.os.close();
m_Parent.ClientSocket.close();
m_Parent.dispose();
System.exit(0);
}
catch(Exception ex){}
}
}
class capture implements Runnable
{
Thread cptt;
int time; //时间片方式时,时间片大小(单位为秒)
int number; //数据包方式时,数据包个数
int sts; //客户端数目
int cc; //本客户端序号
long TE;
Jpcap jpcap;
int dev;
capture(int t,int n,int s,int c,long tiex,int d)
{
time=t;
number=n;
sts=s;
cc=c;
TE=tiex;
dev=d;
start("MainThread");
}
public void start(String a)
{
Thread thr = new Thread(this,a);
thr.start();
}
public void run()
{
if(Thread.currentThread().getName().equals("MainThread"))
run_MainThread();
else if(Thread.currentThread().getName().equals("JpcapTimerThread"))
run_JpcapTimerThread();
}
private void run_MainThread()
{
try{
Thread.sleep(((time*(cc-1)-TE/1000)%(time*cc))*1000);
String[] lists=Jpcap.getDeviceDescription();
jpcap=Jpcap.openDevice(Jpcap.getDeviceList()[dev],2000,true,20);
if(time<0)
jpcap.loopPacket(number,new Tcpdump());
else
{
for(int k=0;k<sts;k++)
{
if(k==1)
{
start("JpcapTimerThread");
jpcap=Jpcap.openDevice(Jpcap.getDeviceList()[dev],2000,true,20);
jpcap.loopPacket(-1,new Tcpdump());
System.out.println("<=时间片结束");
}
else
{
Thread.sleep(1000*time);
}
if(k==sts-1)
k-=sts;
}
}
}catch(Exception e){}
}
private void run_JpcapTimerThread()
{
try{
System.out.println("=>时间片开始");
for(int i=0;i<time;i++)
{
Thread.sleep(1000);
}
jpcap.close();
}catch(Exception e){}
}
}
class Tcpdump implements JpcapHandler
{
public void handlePacket(Packet packet)
{
System.out.println(packet);
try{
RandomAccessFile ff = new RandomAccessFile("Client.txt", "rw");
ff.seek(ff.length());
ff.writeBytes(packet.toString());
ff.close();
}catch(Exception e){}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -