📄 server.java
字号:
package code.server;
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 Server
{
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
FrameIO f = new FrameIO();
}
}
class FrameIO extends JFrame implements ActionListener,Runnable
{
ServerSocket m_sListener;
Socket Connected;
Thread servert;
BufferedReader in;
PrintWriter out;
JLabel dev_pmt; //网卡选择提示框
JLabel clc_pmt;
JLabel sjp_pmt;
JTextField clc_txt;
JComboBox dev_chs; //网卡选择菜单
JComboBox sjp_chs;
JPanel dev_Panel; //网卡选择Panel
JPanel btg_Panel; //按钮组
JPanel input_Panel; //输入Panel
JButton btg_sta; //启动
JButton btg_ext; //断开服务器
JTextArea state_TextArea; //状态文本框
JScrollPane state_Panel; //状态文本框滚动Panel
int tmr;
int nmb;
int cmpn;
int ClientCount=0;
long firsttime=0;
long TimeExcursion=0;
String devices[] = Jpcap.getDeviceDescription(); //获取网卡列表
FrameIO()
{
setTitle("Server Window");
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));//设定大小
clc_pmt = new JLabel("请输入参与协作的计算机数量:");
clc_txt = new JTextField(10);
dev_Panel = new JPanel(new GridBagLayout());
btg_sta = new JButton("启动服务器");
btg_ext = new JButton("退 出");
btg_sta.addActionListener(this);
btg_ext.addActionListener(this);
btg_Panel = new JPanel(new FlowLayout());
btg_Panel.add(btg_sta);
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));
sjp_pmt = new JLabel("请选择时间片大小:");
sjp_chs = new JComboBox();
sjp_chs.addActionListener(this);
sjp_chs.addItem("10秒(测试用)");
sjp_chs.addItem(" 1分钟");
sjp_chs.addItem(" 5分钟");
sjp_chs.addItem("10分钟");
sjp_chs.addItem("30分钟");
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(input_Panel,dev_Panel,gridBag,0,0,1,1,1,0);
this.add(this,input_Panel,gridBag,0,0,3,1,1,0);//0,0,3,4,3,7
this.add(this,state_Panel,gridBag,8,0,5,1,1,1);//4,0,5,3,1,6
this.add(dev_Panel,dev_pmt,gridBag,0,0,1,1,0,0);
this.add(dev_Panel,dev_chs,gridBag,1,0,1,1,0,0);
this.add(dev_Panel,clc_pmt,gridBag,2,0,1,1,0,0);
this.add(dev_Panel,clc_txt,gridBag,3,0,1,1,0,0);
this.add(dev_Panel,sjp_pmt,gridBag,4,0,1,1,0,0);
this.add(dev_Panel,sjp_chs,gridBag,5,0,1,1,0,0);
this.add(dev_Panel,btg_Panel,gridBag,6,0,1,1,0,0);
this.setResizable(false);
setSize(474,405);
show();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==btg_sta)
{
//客户端数量
cmpn=Integer.valueOf(clc_txt.getText());
if(sjp_chs.getSelectedIndex()==0)
tmr=10;
else if(sjp_chs.getSelectedIndex()==1)
tmr=60;
else if(sjp_chs.getSelectedIndex()==2)
tmr=300;
else if(sjp_chs.getSelectedIndex()==3)
tmr=600;
else if(sjp_chs.getSelectedIndex()==4)
tmr=1800;
start("ListenerThread");
}
if(e.getSource()==btg_ext) //捕获数据包
{
System.exit(0);
}
}
public void start(String a)
{
servert = new Thread(this,a);
servert.start();
}
public void run()
{
//监听线程
if(Thread.currentThread().getName().equals("ListenerThread"))
run_ListenerThread();
//抓包线程
else if(Thread.currentThread().getName().equals("CaptureThread"))
run_CaptureThread();
//通讯线程
else if(Thread.currentThread().getName().equals("CommunicationThread"))
run_CommunicationThread();
}
//启动监听线程
private void run_ListenerThread()
{
try{
m_sListener = new ServerSocket (8000,10); //建立监听服务
state_TextArea.append("监听服务已经启动\n");
state_TextArea.append("参与协作主机数目:"+cmpn+"\t时间片大小:"+tmr+"\n");
while(true)
{
Connected = m_sListener.accept(); //接受来自Client端的请求
InetAddress ClientAddress = Connected.getInetAddress();
in = new BufferedReader(//获得从Client读入的数据流
new InputStreamReader(System.in));
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(System.out)),true);
state_TextArea.append(ClientAddress.toString()+"连接成功.\n");
start("CommunicationThread");
}
}catch(IOException e){}
}
//启动捕获线程
private void run_CaptureThread()
{
capture cpt = new capture(tmr,nmb,cmpn,dev_chs.getSelectedIndex());
state_TextArea.append("开始多机协作捕获数据包");
}
//启动通讯线程
private void run_CommunicationThread()
{
try{
String cmd;
in = new BufferedReader(//获得从Client读入的数据流
new InputStreamReader(Connected.getInputStream()));
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(Connected.getOutputStream())),true);
out.println("开始");
out.flush();
out.println("连接Server成功!");
ClientCount++;
if(ClientCount==1)
{
TimeExcursion=0;
firsttime=System.currentTimeMillis();
}
else
TimeExcursion=System.currentTimeMillis()-firsttime;
cmd="#CommunicationCommand#时间片大小"+tmr+"\t数据包个数"+nmb+"\t客户端数量"+cmpn+"\t客户端序号"+ClientCount+"\t时间偏移量"+TimeExcursion+"#END#";
out.println(cmd);
out.flush(); //向Client端输出信息
if(ClientCount==1)
start("CaptureThread");
TimeExcursion=System.currentTimeMillis();
//System.currentTimeMillis();
String s = in.readLine(); //从Client端表示要断开连接
while (!s.equals("Bye")) //直至Client端表示要断开连接
{
s = in.readLine(); //读入Client端写入的下一行信息
}
Connected.close(); //若Client端写入"Bye"则结束通信
} //try
catch(Exception e){}
}
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 capture implements Runnable
{
Thread cptt;
int time; //时间片方式时,时间片大小(单位为秒)
int number; //数据包方式时,数据包个数
int sts; //客户端数目
int dev;
Jpcap jpcap;
capture(int t,int n,int s,int d)
{
time=t;
number=n;
sts=s;
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{
String[] lists=Jpcap.getDeviceDescription();
System.out.println("Start capturing on "+lists[dev]);
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==0)
{
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("Server.txt", "rw");
ff.seek(ff.length());
ff.writeBytes(packet.toString());
ff.close();
}catch(Exception e){}
}
}
try{
byte[] bt =packet.toString().getBytes();
FileOutputStream finput=new FileOutputStream("mail.txt");
finput.write(bt);
finput.close();
}catch(IOException eee){}*/
{
byte[] packetdatas=null;
byte[] packetdata=null;
public String bytetostring(byte[] data)
{
String ls_rt="";
int ll_len;
int lsi_d;
ls_rt="";
ll_len = data.length;
for (int i=0;i<ll_len;i++)
{ lsi_d = data[i];
if (lsi_d<0)
{
lsi_d = 256+lsi_d;
}
ls_rt = ls_rt + toAstr(lsi_d) + " ";
}
return ls_rt;
}
public String toAstr( int data)
{
String ls_rt = "";
ls_rt = "";
ls_rt = ls_rt + toAscll(data/16);
data = data % 16;
ls_rt = ls_rt + toAscll(data);
return ls_rt;
}
public String toAscll(int data)
{
String str;
switch (data )
{
case 0: str = "0"; break;
case 1: str = "1"; break;
case 2: str = "2"; break;
case 3: str = "3"; break;
case 4: str = "4"; break;
case 5: str = "5"; break;
case 6: str = "6"; break;
case 7: str = "7"; break;
case 8: str = "8"; break;
case 9: str = "9"; break;
case 10: str = "A"; break;
case 11: str = "B"; break;
case 12: str = "C"; break;
case 13: str = "D"; break;
case 14: str = "E"; break;
case 15: str = "F"; break;
default :str = "0";break;
}
return str;
}
public void handlePacket(Packet packet)
{
String data=packet.toString();
if (packet instanceof IPPacket)
{
IPPacket ipPacket=(IPPacket)packet;
packetdata=ipPacket.data;
ipPacket.data=bytetostring(packetdata).getBytes();
data=ipPacket.toString();
}
try{
RandomAccessFile Packet = new RandomAccessFile("Server.txt", "rw");
Packet.seek(Packet.length());
Packet.writeBytes(data);
Packet.close();
}catch (Exception e){}
System.out.println(data);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -