JAVA如何获取局域网内所有安卓设备的ip地址,MAC以及序列号?
1得到局域网网段,可由自己机器的IP来确定 (也可以手动获取主机IP-CMD-ipconfig /all)
2根据IP类型,一次遍历局域网内IP地址
JAVA类,编译之后直接运行便可以得到局域网内所有IP,具体怎样使用你自己编写相应代码调用便可
代码如下::
package bean;
import javaio;
import javautil;
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)
Threadsleep(50);
threadCount +=1;
PingIp p = new PingIp(ip);
pstart();
}
public void PingAll() throws Exception{
//首先得到本机的IP,得到网段
InetAddress host = InetAddressgetLocalHost();
String hostAddress = hostgetHostAddress();
int k=0;
k=hostAddresslastIndexOf("");
String ss = hostAddresssubstring(0,k+1);
for(int i=1;i <=255;i++){ //对所有局域网Ip
String iip=ss+i;
Ping(iip);
}
//等着所有Ping结束
while(threadCount>0)
Threadsleep(50);
}
public static void main(String[] args) throws Exception{
Ip ip= new Ip();
ipPingAll();
javautilSet entries = pingentrySet();
Iterator iter=entriesiterator();
String k;
while(iterhasNext()){
MapEntry entry=(MapEntry)iternext();
String key=(String)entrygetKey();
String value=(String)entrygetValue();
if(valueequals("true"))
Systemoutprintln(key+"-->"+value);
}
}
class PingIp extends Thread{
public String ip; // IP
public PingIp(String ip){
thisip=ip;
}
public void run(){
try{
Process p= RuntimegetRuntime()exec ("ping "+ip+ " -w 300 -n 1");
InputStreamReader ir = new InputStreamReader(pgetInputStream());
LineNumberReader input = new LineNumberReader (ir);
//读取结果行
for (int i=1 ; i <7; i++)
inputreadLine();
String line= inputreadLine();
if (linelength() <17 || linesubstring(8,17)equals("timed out"))
pingput(ip,"false");
else
pingput(ip,"true");
//线程结束
threadCount -= 1;
}catch (IOException e){}
}
}
}
举个例子,假设服务器端运行的是servlet,客户端(浏览器)发送url到服务器,经过解析,服务器找到并运行相应的servlet程序,在servlet程序中可以接受到用户提交的信息,比如用户提交方式是Get方式,则servlet调用其doGet方法,在doGet方法中,可以通过request获取用户提交的数据(包括ip)
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String ip = requsetgetRemoteAddr();//获取客户端ip
}
获得了ip后就可以查询ip所属地址,可以登录http://wwwip138com/
若要自己编写软件查询,就要连接数据库。
java获取本机的外网ip示例:
import javaioIOException;
import javaioInputStream;
import javanetHttpURLConnection;
import javanetMalformedURLException;
import javanetURL;
import javautilregexMatcher;
import javautilregexPattern;
/
获取本机外网IP地址
思想是访问网站http://checkipdyndnsorg/,得到返回的文本后解析出本机在外网的IP地址
@author pieryon
/
public class ExternalIpAddressFetcher {
// 外网IP提供者的网址
private String externalIpProviderUrl;
// 本机外网IP地址
private String myExternalIpAddress;
public ExternalIpAddressFetcher(String externalIpProviderUrl) {
thisexternalIpProviderUrl = externalIpProviderUrl;
String returnedhtml = fetchExternalIpProviderHTML(externalIpProviderUrl);
parse(returnedhtml);
}
/
从外网提供者处获得包含本机外网地址的字符串
从http://checkipdyndnsorg返回的字符串如下
<html><head><title>Current IP Check</title></head><body>Current IP Address: 123147226222</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) urlopenConnection();
// 连接设置
HttpURLConnectionsetFollowRedirects(true);
httpConnsetRequestMethod("GET");
httpConnsetRequestProperty("User-Agent",
"Mozilla/40 (compatible; MSIE 60; Windows 2000)");
// 获取连接的输入流
in = httpConngetInputStream();
byte[] bytes=new byte[1024];// 此大小可根据实际情况调整
// 读取到数组中
int offset = 0;
int numRead = 0;
while (offset < byteslength
&& (numRead=inread(bytes, offset, byteslength-offset)) >= 0) {
offset += numRead;
}
// 将字节转化为为UTF-8的字符串
String receivedString=new String(bytes,"UTF-8");
// 返回
return receivedString;
} catch (MalformedURLException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
} finally {
try {
inclose();
httpConndisconnect();
} catch (Exception ex) {
exprintStackTrace();
}
}
// 出现异常则返回空
return null;
}
/
使用正则表达式解析返回的HTML文本,得到本机外网地址
@param html
/
private void parse(String html){
Pattern pattern=Patterncompile("(\\d{1,3})[](\\d{1,3})[](\\d{1,3})[](\\d{1,3})", PatternCASE_INSENSITIVE);
Matcher matcher=patternmatcher(html);
while(matcherfind()){
myExternalIpAddress=matchergroup(0);
}
}
/
得到本机外网地址,得不到则为空
@return
/
public String getMyExternalIpAddress() {
return myExternalIpAddress;
}
public static void main(String[] args){
ExternalIpAddressFetcher fetcher=new ExternalIpAddressFetcher("http://checkipdyndnsorg/");
Systemoutprintln(fetchergetMyExternalIpAddress());
}
}
网络通信可分为两种模式:TCP有连接的通信
UDP无连接的通信
依照上述的问题我可以理解为你是要进行有连接的通信。是要经过三次握手才能实现可靠的连接
第一次:建立连接时三次握手,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN(Synchronize Sequence Numbers)同步序列号。
服务器端即可使用:
Socket s=serverSocketaccept();
String clientIP=sgetInetAddress()toString();
这就实现了java服务器端获取到连接此服务器的客户端的IP了,你若想实现获取所有连接此服务器的客户端的IP,你可以把每次accept()返回的socket放进全局的Vector里面,然后在遍历这个vector方法就同上代码咯……
在JSP里,获取客户端的IP地址的方法是:requestgetRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了 Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。如果使用了反向代理软件,用 requestgetRemoteAddr()方法获取的IP地址是:127001或 1921681110,而并不是客户端的真实IP。
requestgetRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。
于是可得出获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request) {
if (requestgetHeader("x-forwarded-for") == null) {
return requestgetRemoteAddr();
}
return requestgetHeader("x-forwarded-for");
}
你可以写一个Filter配置在webxml中 让服务器启动的时候就开始监听 直到服务器停止!
只能根据用户请求带过来的sessionID所匹配的ip地址 而且只可以通过request获得ip 反正你能得到session 那得到request是一样简单的不是吗
得到request后命令为:
String ip = requestgetRemoteAddr();
这个ip字符串就是了
获得项目服务器的IP大概做法是在配置文件里面进行配置,可以使服务器已启动便执行,示例如下:
启动服务器的时候启动一个类,可以在webxml中配置,如下:<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<init-param>
<param-name>basedir</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
指明你需要启动的servlet即可
0条评论