① java中如何获取到本机的外网ip地址
java获取本机的外网ip示例:
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 获取本机外网IP地址
* 思想是访问网站http://checkip.dyndns.org/,得到返回的文本后解析出本机在外网的IP地址
* @author pieryon
*
*/
public class ExternalIpAddressFetcher {
// 外网IP提供者的网址
private String externalIpProviderUrl;
// 本机外网IP地址
private String myExternalIpAddress;
public ExternalIpAddressFetcher(String externalIpProviderUrl) {
this.externalIpProviderUrl = externalIpProviderUrl;
String returnedhtml = fetchExternalIpProviderHTML(externalIpProviderUrl);
parse(returnedhtml);
}
/**
* 从外网提供者处获得包含本机外网地址的字符串
* 从http://checkip.dyndns.org返回的字符串如下
* <html><head><title>Current IP Check</title></head><body>Current IP Address: 123.147.226.222</body></html>
* @param externalIpProviderUrl
* @return
*/
private String fetchExternalIpProviderHTML(String externalIpProviderUrl) {
// 输入流
InputStream in = null;
// 到外网提供者的Http连接
HttpURLConnection httpConn = null;
try {
// 打开连接
URL url = new URL(externalIpProviderUrl);
httpConn = (HttpURLConnection) url.openConnection();
// 连接设置
HttpURLConnection.setFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.setRequestProperty("User-Agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
// 获取连接的输入流
in = httpConn.getInputStream();
byte[] bytes=new byte[1024];// 此大小可根据实际情况调整
// 读取到数组中
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=in.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// 将字节转化为为UTF-8的字符串
String receivedString=new String(bytes,"UTF-8");
// 返回
return receivedString;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
httpConn.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 出现异常则返回空
return null;
}
/**
* 使用正则表达式解析返回的HTML文本,得到本机外网地址
* @param html
*/
private void parse(String html){
Pattern pattern=Pattern.compile("(\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})[.](\\d{1,3})", Pattern.CASE_INSENSITIVE);
Matcher matcher=pattern.matcher(html);
while(matcher.find()){
myExternalIpAddress=matcher.group(0);
}
}
/**
* 得到本机外网地址,得不到则为空
* @return
*/
public String getMyExternalIpAddress() {
return myExternalIpAddress;
}
public static void main(String[] args){
ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher("http://checkip.dyndns.org/");
System.out.println(fetcher.getMyExternalIpAddress());
}
}
② java怎么获取请求的ip
java获取外网ip地址方法:
public class Main {
public static void main(String[] args) throws SocketException {
System.out.println(Main.getRealIp());
}
public static String getRealIp() throws SocketException {
String localip = null;// 本地IP,如果没有配置外网IP则返回它
String netip = null;// 外网IP
Enumeration<NetworkInterface> netInterfaces =
NetworkInterface.getNetworkInterfaces();
InetAddress ip = null;
boolean finded = false;// 是否找到外网IP
while (netInterfaces.hasMoreElements() && !finded) {
NetworkInterface ni = netInterfaces.nextElement();
Enumeration<InetAddress> address = ni.getInetAddresses();
while (address.hasMoreElements()) {
ip = address.nextElement();
if (!ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {// 外网IP
netip = ip.getHostAddress();
finded = true;
break;
} else if (ip.isSiteLocalAddress()
&& !ip.isLoopbackAddress()
&& ip.getHostAddress().indexOf(":") == -1) {// 内网IP
localip = ip.getHostAddress();
}
}
}
if (netip != null && !"".equals(netip)) {
return netip;
} else {
return localip;
}
}
}
③ java如何编程实现,获取固定IP发来所有的数据包
额。。。初看到你的问题的时候吓了一跳。还以为是用java实现网络嗅探呢。
你问的是socket编程?
那么socket 均分为两个,
一部分是服务端,
一部分是客户端,
服务端一直开启着监听,
现在你的情况和平时不太一样的是,平时,是服务端的ip不变化,而客户端的变化。而是客户端给服务端进行发送。
你的情况是相反。客户端经常变动ip或者端口,而要求服务端发送。
其实转换一下思路就好了。
有点类似于现在网页在线聊天工具里的“长连接”思想。
你的那个固定ip服务器,可以完全不管,你是什么端口。因为,如果你的电脑准备好接受数据了。那么你就向服务端发起请求。而服务端将结果发送给你。就是说,不是说服务器一直给你发送,而是,你这个客户端只要准备好接受数据,就向服务器发送请求。这样,不是没有问题了么。。
如果还按你那个思路就是,你的电脑,需要实现网络嗅探的部分功能。但是
Java是网络层以上的。
你通过Java的Socket得到的数据包嗅探不出什么敏感的东东了。
所以Java不适合做网络嗅探。
不过还好,现在有了叫jpcap的工具。你可以搜一下,
下面是一个简单的实现,里面获得了来源的ip和端口 你可以加一个判断,如果来源ip是固定的ip的话,那么,你可以获取对应的数据包
本程序用eclipse编辑在J2SDK6.0+WinPcap 3.1+Jpcap 0.5下编译运行
/*******************
* JpcapTip.java
*/
package m;
import jpcap.PacketReceiver;
import jpcap.JpcapCaptor;
import jpcap.packet.*;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
//import java.net.InetAddress;
//import java.net.UnknownHostException;
public class JpcapTip implements PacketReceiver {
public void receivePacket(Packet packet) {
System.out.println("********************************************");
/*IP数据报报文头*/
byte[] l=packet.header;
/*
for (int t=0;t<21;t++){
System.out.print(l[t]+" *** ");
}
*/
String str="";
System.out.print("报文头 : ");
for (int i=0;i<l.length;i++) {
//str=str+l;
int m=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+Integer.toHexString(m);
//System.out.print(" *** "+l[i]);
}
System.out.println(str);
int d=l.length;
System.out.println("首部长度 :"+(d*8)+"bit");
/*分析源IP地址和目的IP地址*/
/*分析协议类型*/
/**
if(packet.getClass().equals(IPPacket.class)) {
IPPacket ipPacket=(IPPacket)packet;
byte[] iph=ipPacket.option;
String iphstr=new String(iph);
System.out.println(iphstr);
}
*/
if(packet.getClass().equals(ARPPacket.class))
{
System.out.println("协议类型 :ARP协议");
try {
ARPPacket arpPacket = (ARPPacket)packet;
System.out.println("源网卡MAC地址为 :"+arpPacket.getSenderHardwareAddress());
System.out.println("源IP地址为 :"+arpPacket.getSenderProtocolAddress());
System.out.println("目的网卡MAC地址为 :"+arpPacket.getTargetHardwareAddress());
System.out.println("目的IP地址为 :"+arpPacket.getTargetProtocolAddress());
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(UDPPacket.class))
{
System.out.println("协议类型 :UDP协议");
try {
UDPPacket udpPacket = (UDPPacket)packet;
System.out.println("源IP地址为 :"+udpPacket.src_ip);
int tport = udpPacket.src_port;
System.out.println("源端口为:"+tport);
System.out.println("目的IP地址为 :"+udpPacket.dst_ip);
int lport = udpPacket.dst_port;
System.out.println("目的端口为:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(TCPPacket.class)) {
System.out.println("协议类型 :TCP协议");
try {
TCPPacket tcpPacket = (TCPPacket)packet;
int tport = tcpPacket.src_port;
System.out.println("源IP地址为 :"+tcpPacket.src_ip);
System.out.println("源端口为:"+tport);
System.out.println("目的IP地址为 :"+tcpPacket.dst_ip);
int lport = tcpPacket.dst_port;
System.out.println("目的端口为:"+lport);
} catch( Exception e ) {
e.printStackTrace();
}
}
else
if(packet.getClass().equals(ICMPPacket.class))
System.out.println("协议类型 :ICMP协议");
else
System.out.println("协议类型 :GGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4");
/*IP数据报文数据*/
byte[] k=packet.data;
String str1="";
System.out.print("数据 : ");
for(int i=0;i<k.length;i++) {
//int m=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+Integer.toHexString(m);
str1 = new String(k);
//str1=str1+k[i];
//System.out.print(" *** "+k[i]);
}
System.out.println(str1);
System.out.println("数据报类型 : "+packet.getClass());
System.out.println("********************************************");
}
public static void main(String[] args) throws Exception{
// TODO 自动生成方法存根
NetworkInterface[] devices = JpcapCaptor.getDeviceList(); //.getDeviceList();.
//for (int i =0; i<devices.length;i++) {
int a=0;
//try {
/*本地网络信息*/
byte[] b=devices[1].mac_address; //网卡物理地址
//}
//catch() {}
System.out.print("网卡MAC : 00");
for (int j=0;j<b.length;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
System.out.print(Integer.toHexString(a));
}
System.out.println();
NetworkInterfaceAddress[] k=devices[1].addresses;
//System.out.println("网卡MAC : "+Integer.toHexString(a));
for(int n=0;n<k.length;n++) {
System.out.println("本机IP地址 : "+k[n].address); //本机IP地址
System.out.println("子网掩码 : "+k[n].subnet); //子网掩码
}
System.out.println("网络连接类型 : "+devices[1].datalink_description);
//}
NetworkInterface deviceName = devices[1];
/*将网卡设为混杂模式下用网络设备deviceName*/
JpcapCaptor jpcap =JpcapCaptor.openDevice(deviceName, 2000, false, 1); //openDevice(deviceName,1028,false,1);
jpcap.loopPacket(-1,new JpcapTip());
}
}
加油~~
④ java怎么解析Wireshark抓包文件
Wireshark数据包解析:在Wireshark中关于数据包的叫法有三个术语,分别是帧、包、段。
注意:
如果链接另一个Web站点时,客户端将再次对下一个站点进行DNS查询(156、157帧),TCP三次握手(158、159、160帧)。
31帧是客户端请求网络,通过DNS服务器解析IP地址的过程。标识为“A”记录。
32帧是DNS服务器回应客户端请求的过程。标识为response。
⑤ java网络抓ip包 首部是个什么情况
首先要去下载jpcap并在IDE上做配置,具体操作方式参考以下链接
网页链接
代码:
importjava.io.IOException;
importjpcap.*;
importjpcap.packet.IPPacket;
importjpcap.packet.Packet;
publicclassTest{
publicstaticvoidmain(String[]args){
/*-------------- 第一步绑定网络设备--------------*/
NetworkInterface[]devices=JpcapCaptor.getDeviceList();
for(NetworkInterfacen:devices){
System.out.println(n.name+"|"+n.description);
}
System.out.println("-------------------------------------------");
JpcapCaptorjpcap=null;
intcaplen=1512;
booleanpromiscCheck=true;
try{
jpcap=JpcapCaptor.openDevice(devices[1],caplen,promiscCheck,50);
//0或1
}catch(IOExceptione){
e.printStackTrace();
}
/*----------第二步抓包-----------------*/
inti=0;
while(i<10){
Packetpacket=jpcap.getPacket();
if(packetinstanceofIPPacket&&((IPPacket)packet).version==4){
i++;
IPPacketip=(IPPacket)packet;//强转
System.out.println("版本:IPv4");
System.out.println("优先权:"+ip.priority);
System.out.println("区分服务:最大的吞吐量:"+ip.t_flag);
System.out.println("区分服务:最高的可靠性:"+ip.r_flag);
System.out.println("长度:"+ip.length);
System.out.println("标识:"+ip.ident);
System.out.println("DF:Don'tFragment:"+ip.dont_frag);
System.out.println("NF:NoreFragment:"+ip.more_frag);
System.out.println("片偏移:"+ip.offset);
System.out.println("生存时间:"+ip.hop_limit);
Stringprotocol="";
switch(newInteger(ip.protocol)){
case1:
protocol="ICMP";
break;
case2:
protocol="IGMP";
break;
case6:
protocol="TCP";
break;
case8:
protocol="EGP";
break;
case9:
protocol="IGP";
break;
case17:
protocol="UDP";
break;
case41:
protocol="IPv6";
break;
case89:
protocol="OSPF";
break;
default:
break;
}
System.out.println("协议:"+protocol);
System.out.println("源IP"+ip.src_ip.getHostAddress());
System.out.println("目的IP"+ip.dst_ip.getHostAddress());
System.out.println("源主机名:"+ip.src_ip);
System.out.println("目的主机名:"+ip.dst_ip);
System.out.println("----------------------------------------------");
}
}
}
}
~
⑥ 如何获取局域网内所有IP地址 java代码
1.得到局域网网段,可由自己机器的IP来确定 (也可以手动获取主机IP-CMD-ipconfig /all)
2.根据IP类型,一次遍历局域网内IP地址
JAVA类,编译之后直接运行裤陆便可以得到局域网内所有IP,具体怎样使用你自己编写相应代码调用便可
代码如下::
package bean;
import java.io.*;
import java.util.*;
public class Ip{
static public HashMap ping; //ping 后的结果集
public HashMap getPing(){ //用来得到ping后的结果集
return ping;
}
//胡芦顷当前线程的数量, 防止过多线程摧毁电脑
static int threadCount = 0;
public Ip() {
ping = new HashMap();
}
public void Ping(String ip) throws Exception{
//最多30个线程
while(threadCount>30)
Thread.sleep(50);
threadCount +=1;
PingIp p = new PingIp(ip);
p.start();
}
public void PingAll() throws Exception{
//首先得到本机的IP,得到网段
InetAddress host = InetAddress.getLocalHost();
String hostAddress = host.getHostAddress();
int k=0;
k=hostAddress.lastIndexOf(".");
String ss = hostAddress.substring(0,k+1);
for(int i=1;i <=255;i++){ //对所有局域网哗做Ip
String iip=ss+i;
Ping(iip);
}
//等着所有Ping结束
while(threadCount>0)
Thread.sleep(50);
}
public static void main(String[] args) throws Exception{
Ip ip= new Ip();
ip.PingAll();
java.util.Set entries = ping.entrySet();
Iterator iter=entries.iterator();
String k;
while(iter.hasNext()){
Map.Entry entry=(Map.Entry)iter.next();
String key=(String)entry.getKey();
String value=(String)entry.getValue();
if(value.equals("true"))
System.out.println(key+"-->"+value);
}
}
class PingIp extends Thread{
public String ip; // IP
public PingIp(String ip){
this.ip=ip;
}
public void run(){
try{
Process p= Runtime.getRuntime().exec ("ping "+ip+ " -w 300 -n 1");
InputStreamReader ir = new InputStreamReader(p.getInputStream());
LineNumberReader input = new LineNumberReader (ir);
//读取结果行
for (int i=1 ; i <7; i++)
input.readLine();
String line= input.readLine();
if (line.length() <17 || line.substring(8,17).equals("timed out"))
ping.put(ip,"false");
else
ping.put(ip,"true");
//线程结束
threadCount -= 1;
}catch (IOException e){}
}
}
}
⑦ 如何用ethereal捕获ip数据包
一、打开抓包配置项:
1. 通过CaptureOptions,点开抓包选项配置
Ethereal使用方法:[1]开始网络抓包
二、设置抓包配置项
1. 设置抓包的网卡
2. 设置抓包的过滤项:只有满足条件的数据才会被如枣Ethereal 捕捉,如果不填则
捕捉所有的数据包
Ethereal使用方法:[1]开始网络抓包
三、开始抓包
1. 点击Capture 按钮,开始Ethereal 开始抓包
Ethereal使用方法:[1]开始网络抓包渣渣拆
四、停止抓包
1. 点击停止按钮,停止抓包
Ethereal使用方法:[1]开始网络抓包
5
五、再次开始抓包
1. 如果不需要重新设置抓包的选项,可以直接点击CaptureStart 来再次梁指抓包
⑧ java编程:听说有个叫网络嗅探器的东西,请问原理是 怎么做出来的啊
Sniffer啊,自己去查,不想大片转贴了。
主要原理是利用网卡的混杂模式,和以太网自身的特点进行的。
java写的话用 JPACAP
Jpcap是一个能够抓取与发送网络数据包的Java组件。可以使用Jpcap从一个网络接口获取数据包,然后在Java中对它们进行分析和显示。同样也可以通过一个网络接口发送任意数据包。Jpcap当前能够 捕获以太网,IPv4,IPv6,ARP/RARP,TCP,UDP和ICMPv4数据包。
Jpcap实际上并非一个真正去实现对数据链路层的控制,而是一个中间件,Jpcap调用wincap/libcap,而给Java语言提供一个公共的接口,从而实现了平台无关性。在官方网站上声明,Jpcap支持FreeBSD3.x,Linux RedHat6.1, Fedora Core4,Solaris,and Microsoft Windows 2000/XP等系统。
Jpcap的整个结构大体上跟wincap/libpcap是很相像的,例如NetworkInterface类对应wincap的 typedef struct_ADAPTER ADAPTER,getDeviceList()对应pcap_findalldevs()等等。
Jpcap主要的类有如下几个:
1.NetworkInterface
该类的每一个实例代表一个网络设备,一般就是网卡。这个类只有一些数据成员,除了继承自java.lang.Object的基本方法以外,没有定义其它方法。
2.JpcapCaptor
该类提供了一系列静态方法实现一些基本的功能。该类一个实例代表建立了一个与指定设备的链接,可以通过该类的实例来控制设备,例如设定网卡模式、设定过滤关键字等等。
3.JpcapSender
该类专门用于控制数据包的发送。
4.Packet
这个是所有其它数据包类的父类。Jpcap所支持的数据包有:
ARPPacket、DatalinkPacket、EthernetPacket、ICMPPacket、IPPacket、TCPPacket、UDPPacket。
⑨ java获得IP地址
下面有一篇文章,介绍若何读取物理网卡的地址 ,同样的
你可以用这个方法读取你所需要的本机IP地址
=======================================================
J2SE5.0新特性之ProcessBuilder
这个例子使用了J2SE5.0的ProcessBuilder类执行外部的程序,相对于 Runtime.exec ,它更方便,可以设置环境变量等。这里使用它在windows下读取物理网卡的地址
package com.kuaff.jdk5package;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class ProcessBuilderShow
{
public static List getPhysicalAddress()
{
Process p = null;
//物理网卡列表
List address = new ArrayList();
try
{
//执行ipconfig /all命令
p = new ProcessBuilder("ipconfig", "/all").start();
}
catch (IOException e)
{
return address;
}
byte[] b = new byte[1024];
StringBuffer sb = new StringBuffer();
//读取进程输出值
InputStream in = p.getInputStream();
try
{
while (in.read(b)>0)
{
sb.append(new String(b));
}
}
catch (IOException e1)
{
}
finally
{
try
{
in.close();
}
catch (IOException e2)
{
}
}
//以下分析输出值,得到物理网卡
String rtValue = sb.substring(0);
int i = rtValue.indexOf("Physical Address. . . . . . . . . :");
while(i>0)
{
rtValue = rtValue.substring(i + "Physical Address. . . . . . . . . :".length());
address.add(rtValue.substring(0,18));
i = rtValue.indexOf("Physical Address. . . . . . . . . :");
}
return address;
}
public static void main(String[] args)
{
List address = ProcessBuilderShow.getPhysicalAddress();
for(String add:address)
{
System.out.printf("物理网卡地址:%s%n", add);
}
}
}
⑩ JAVA DatagramSocket(int port)模式获取本地IP地址
给你个小例子希望对你有用
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient
{
public static void main(String args[]) throws Exception
{
DatagramSocket ds=new DatagramSocket();
String s="你好!";
DatagramPacket dp=new DatagramPacket(s.getBytes(),s.getBytes().length,
InetAddress.getByName("192.168.0.98"),8888);
ds.send(dp);
ds.close();
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServet
{
public static void main(String args[]) throws Exception
{
DatagramSocket ds=new DatagramSocket(8888);
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength())+"from"+
dp.getAddress().getHostAddress()+":"+dp.getPort();
System.out.println(str);
ds.close();
}
}