【JavaSE】网络编程 Jpcap的使用

【JavaSE】网络编程 Jpcap的使用


前言:由于之前课程需要做个网络课程设计,题目是IP数据包的捕获与解析,考虑再三之后选择用Java来做(主要是因为Java界面比较好写,个人这么觉得),于是在做课设的过程中搜寻大量相关资料找到Jpcap这么个扩展包,JavaSE中对TCPUDP都做了很好的封装,很方便的可以进行数据的交互,但是却没能将这些包进行抓捕和解析,Jpcap刚好弥补了这一点,通过封装好的类和方法来调用Winpcap进行抓包并进行解析,完美的解决了这个问题,接下来就给大家分享一下Jpcap的用法和本人的课程设计程序,也方便日后自己复习。


Jpcap的使用:

1.安装的话网上有很多教程,这里就不做说明了,大家直接百度吧,要说的一点是64位和32位的主机是用的dll文件是不同的(至少32位不能用在64位上),在调整好这个问题之后,我自己的主机上还出现了一个问题,自己的机器是64位的,用实验室的32位主机可以完美运行的程序放到我的主机上就会报出如下的错误:

java.lang.NoSuchMethodError:setRoutingOption

   at jpcap.JpcapCaptor.nativeOpenLive(NativeMethod)

   at jpcap.JpcapCaptor.openDevice(JpcapCaptor.java:68)

其实我到现在还没解决这个问题,网上找了很多,说是配置的方法问题,但我确实是按照正确方法来的,还是会抛出这个异常,不过这个异常完全不会影响程序的运行(32位无异常完美运行)所以大家有相同问题的能解决就解决,不能解决的无视算了,貌似没影响的说。但是如果抛出了其他异常的话八成是dll文件的问题,还有就是Jpcap需要安装Winpcap软件才能用,一切弄好之后就可以使用了。

 

2.抓包和解析需要用到的方法和类并不多,所有的类包含于下面两个包中:

import jpcap.*;

import jpcap.packet.*;

下面就介绍一下抓包程序中用到的一些关键性方法:

1.NetworkInterface[] devices =JpcapCaptor.getDeviceList();

//获取网卡信息,主机中有几个网卡NetworkInterface数组就会获取几个元素

2.captor =JpcapCaptor.openDevice(devices[0],2000, true, 3000);

//开启网卡进行准备进行抓包,第一个参数是所选网卡,第二个参数为数据报最大长度,第三个参数为是否设置为混杂模式,第四个参数为最长等待时间。

3.captor.setFilter("ip", true);

//设置过滤器,若不进行设置则获取所有网卡抓获的数据包,此句意思为设置为只抓取IP数据包。

4.IPPacket ip = (IPPacket) captor.getPacket();

//获取一个数据包并转换成IP数据包类,因为getPacket()返回的是一个Packet类型,所以需要进行强制类型转换后进行解析。

5.ip.protocol

//接下来解析就很容易了,IPPacket类已经将我们需要解析的信息都已经封装好了,直接用据点运算符一个个获取然后转换类型显示就行了。如果想获取到更多的信息则可以再确认IP数据包的协议类型之后在进行ICMPPacket,TCPPacket,UDPPacket的转换然后获取相应的解析信息

6.EthernetPacket datalink = (EthernetPacket) ip.datalink;

//如果想获取下层信息也是可以的,利用这条语句可以直接获取到数据包数据链路层的相关信息并进行解析。

注:Jpcap中还有许多对数据包包操作的类与方法,由于抓包用不上就不列出来了,有兴趣可以下载帮助文档查看(后面有打包可下载)。

 

3.抓包代码如下(解析代码和界面代码放在一个类中,抓包类中只有一些静态方法):

import java.io.IOException;

import jpcap.*;
import jpcap.packet.*;

public class IPCaptor {
	
	private static JpcapCaptor captor = null;
	
	public static void open() throws IOException {
		NetworkInterface[] devices = JpcapCaptor.getDeviceList();
		captor = JpcapCaptor.openDevice(devices[0], 2000, true, 3000);	
	}
	
	public static void setFilterType(int type) throws IOException {
		switch (type) {
			case 0:
				captor.setFilter("ip", true);
				break;
			case 1:
				captor.setFilter("tcp", true);
				break;
			case 2:
				captor.setFilter("udp", true);
				break;
			case 3:
				captor.setFilter("icmp", true);
				break;
			}
	}
	
	public static IPPacket cap(){
		IPPacket ip = null;
		while (true) {		//循环直到抓到一个包
			ip = (IPPacket) captor.getPacket();
			if (ip != null) {
				return ip;
			}
		}
	}
}



简单的界面设计:

GUI编程在这里就不多说了,程序运行如下:

 

如果有兴趣的话可以下载后面的压缩包参考一下代码,代码略长就不贴出来了直接一并打包了,当然需要Jpcap32位64位、Jpcap文档、或者网络课程设计报告的都可以下载后面那个压缩包,都一并打包放这里了,需要请戳这里







因为做的时间短,所以学习Jpcap和程序编写都不是很优,所以有问题还欢迎交流~

本文固定链接:http://blog.csdn.net/fyfmfof/article/details/36476411

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
JavaSE网络编程采用的是基于TCP/IP协议的网络模型。这个模型包括客户端和服务器端两部分。客户端通过套接字(Socket)与服务器建立连接,服务器则监听客户端的连接请求并进行响应。 在Java中,可以使用Socket类和ServerSocket类来实现网络编程。Socket类用于建立客户端与服务器之间的通信连接,而ServerSocket类则用于创建服务器端的套接字,监听并接受客户端的连接请求。 客户端通过创建Socket对象,指定服务器的IP地址和端口号,然后通过Socket对象的方法与服务器进行通信。服务器端通过创建ServerSocket对象,指定服务器要监听的端口号,并通过accept()方法接受客户端的连接请求。一旦建立了连接,客户端和服务器端就可以通过输入流和输出流来进行数据的传输。 网络模型是基于TCP/IP协议的,因此可以使用Java的InputStream和OutputStream来进行数据的读写。客户端可以通过InputStream从服务器端接收数据,通过OutputStream向服务器端发送数据。服务器端则可以通过InputStream接收客户端发送的数据,通过OutputStream向客户端发送数据。 总结来说,JavaSE网络编程采用的是基于TCP/IP协议的网络模型,通过Socket和ServerSocket来实现客户端和服务器端之间的通信。通过InputStream和OutputStream来进行数据的读写。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaSE——网络编程](https://blog.csdn.net/yzl1293346757/article/details/126192384)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaSE学习——网络编程](https://blog.csdn.net/Demon_and_Angle_/article/details/126387829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值