랜 에서 장치 의 ip 와 hostname 을 가 져 옵 니 다.
5494 단어 자바 네트워크 프로 그래 밍
첫 번 째 는 셸 작업 ping 을 통 해 호스트 이름 을 내 는 것 입 니 다.
원 리 는 랜 에서 ip 세그먼트 가 마지막 으로 다르다 는 것 이다. 예 를 들 어 192.168.0.1 과 192.168.0.12 는 같은 랜 에 속한다.
랜 IP 를 옮 겨 다 니 는 것 은 크게 두 단계 로 나 눌 수 있 습 니 다. 1. 랜 네트워크 를 얻 으 면 자신의 기기 의 IP 로 확인 할 수 있 습 니 다. 2. IP 유형 에 따라 랜 내 IP 주 소 를 한 번 에 옮 겨 다 니 는 것 (0 - - 255)
이것 은 ping 명령 을 실행 함으로써 이 루어 집 니 다 (ping 192.168.0.1). 그러나 이 과정 은 255 회 실행 되 고 느 리 며 다 중 스 레 드 를 통 해 이 루어 집 니 다.
class LanPing
테스트 실행
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class LanPing {
private int corePoolSize;//
private int maximumPoolSize;
private ThreadPoolExecutor threadPool;
private List devices; // ping ip+hostName;
public LanPing() {
corePoolSize=5;
maximumPoolSize=100;
threadPool=new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 3,
TimeUnit.SECONDS, new ArrayBlockingQueue(10),
new ThreadPoolExecutor.CallerRunsPolicy());
devices=new ArrayList();
}
public List search() throws UnknownHostException, InterruptedException{
InetAddress host = InetAddress.getLocalHost();
String hostName=host.getHostName();
String hostAddress = host.getHostAddress();
System.out.println(hostName+":"+hostAddress);
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;
threadPool.execute(new PingIP(iip));
Thread.sleep(100);
}
return devices;
}
class PingIP implements Runnable{
private String ip;
public PingIP(String ip) {
this.ip=ip;
}
synchronized public void run(){
try{
String ping="ping -n 1 -w 5 "+ip;
System.out.println(ping);
Process process=Runtime.getRuntime().exec(ping);
InputStreamReader inputStream = new InputStreamReader(process.getInputStream(),"GBK");
BufferedReader reader=new BufferedReader(inputStream);
StringBuffer buf=new StringBuffer();
String s;
while((s=reader.readLine())!=null){
buf.append(s+"
");
}
if(buf.toString().indexOf(" ")!=-1){
}else{
InetAddress host = InetAddress.getByName(ip);
String hostName=host.getHostName();
DeviceInfo deviceInfo=new DeviceInfo(hostName, ip);
devices.add(deviceInfo);
System.out.println(hostName+":"+ip);
}
//System.out.println(buf.toString());
}catch(IOException e){
e.printStackTrace();
}
}
}
class DeviceInfo{
private String name;
private String ip;
public DeviceInfo(String name,String ip) {
this.name=name;
this.ip=ip;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
}
두 번 째 는 랜 에서 모든 호스트 에 서버 감청 프로그램 을 설치 한 다음 에 한 대의 장치 방송 을 통 해 모든 장치 정 보 를 얻 는 것 이다. 단점 은 사전에 랜 에 모든 장 치 를 설치 해 야 한 다 는 것 이다.
서버 쪽
LanPing lanPing=new LanPing();
try {
List infos=lanPing.search();
for(LanPing.DeviceInfo info:infos){
System.out.println(info.getName()+":"+info.getIp());
}
} catch (Exception e) {
e.printStackTrace();
}
클 라 이언 트
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;
public class ControllerServer {
private int port;
private final int DATA_LENGTH=1024*4;
MouseController controller;
public ControllerServer(int port) throws IOException {
this.port=port;
}
public void service() throws IOException{
byte[] inBuf=new byte[DATA_LENGTH]; //
DatagramPacket inPacket=new DatagramPacket(inBuf, DATA_LENGTH);//
DatagramPacket outPacket=null;//
DatagramSocket socket=null;
socket = new DatagramSocket(port);
while(true){
socket.receive(inPacket);
byte[] outBuf=new byte[DATA_LENGTH]; //
outPacket=new DatagramPacket(outBuf, DATA_LENGTH, inPacket.getAddress(), inPacket.getPort());
//
String receiveStr=new String(inPacket.getData(), 0, inPacket.getLength());
System.out.println(receiveStr);
if(receiveStr.equals("connect")){//
InetAddress host=InetAddress.getLocalHost();
String ip=host.getHostAddress();
String hostname=host.getHostName();
String data="success--"+ip+"--"+hostname;
outBuf=data.getBytes();
outPacket.setData(outBuf);
socket.send(outPacket);
}
}
}
}