⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.java

📁 此源代码是基于Java编程的实现客户端和服务器端通信功能
💻 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 + -