검색결과 리스트
글
[JAVA] 같은 공유기에 접속중인 기기의 IP 주소 확인하는방법
프로그래밍 팁
2015. 10. 15. 01:50
TCP를 통해 Socket 통신을 하기 위해서는 접속하고자 하는 기기에 할당된 IP주소를 알고 있어야 합니다. 다시 말하자면, IP 주소를 알지 못할 경우 TCP를 통해서는 기기간의 통신이 불가능하다는 것입니다.
그렇다면 상대의 IP 주소를 알아낼 수 있는 방법은 없는 것일까요? IP 프로토콜 규약에 의하면 특수 IP 주소를 사용하면 다른 기기와 통신이 가능하도록 설정되어 있습니다. 예를 들어 '255.255.255.255' 주소로 패킷을 보내면 같은 라우터(공유기) 내에 연결된 모든 기기들이 이를 수신하게 됩니다. 이를 Broadcast라고 칭하며 이를 사용하기 위해서는 TCP가 아닌 UDP 방식을 사용하여야 합니다.
아래의 소스코드는 UDP 방식을 사용하여 서버가 IP주소 '255.255.255.255'를 통해 같은 라우터(공유기) 내에 접속중인 기기들에게 패킷을 보낸 후 이를 수신한 기기가 자신의 IP 주소를 서버에 알려주는 방식입니다.
- DatagramPacket가 상대에게 전송될 때 해당 패킷 안에는 패킷을 보낸 측의 IP 주소가 담겨 있습니다. 이를 통해 서버측 IP와 클라이언트측 IP를 서로 알 수 있습니다.
Server측
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub RecvServer rm = new RecvServer(); rm.start(); for (int i = 0; i < 10; i++) { try { new SearchDevice("255.255.255.255", 8200).start(); Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } rm.closeServer(); } static class SearchDevice extends Thread { InetAddress ia; int port; SearchDevice(String IPaddr, int Port) { try { ia = InetAddress.getByName(IPaddr); port = Port; } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { String msg = "Hello, ELECS!"; try { DatagramSocket ds = new DatagramSocket(); int length = msg.length(); byte[] msgbyte = msg.getBytes(); DatagramPacket dp = new DatagramPacket(msgbyte, length, ia, port); ds.send(dp); ds.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } static class RecvServer extends Thread { String text; String clientIp; DatagramPacket dp; DatagramSocket ds; Object lock = new Object(); public void closeServer() { synchronized (lock) { ds.close(); } } public void run() { int port = 8000; byte[] message = new byte[1000]; dp = new DatagramPacket(message, message.length); try { ds = new DatagramSocket(port); ds.receive(dp); synchronized (lock) { text = new String(message, 0, dp.getLength()); ds.close(); clientIp = dp.getAddress().getHostAddress(); System.out.println("Client IP : " + clientIp); } } catch (Exception e) { e.printStackTrace(); } } } } | cs |
Client측
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub String text; String serverIp; DatagramPacket dp; int port = 8200; byte[] message = new byte[1000]; dp = new DatagramPacket(message, message.length); try { DatagramSocket ds = new DatagramSocket(port); ds.receive(dp); text = new String(message, 0, dp.getLength()); ds.close(); serverIp = dp.getAddress().getHostAddress(); new SearchDevice(serverIp, 8000).start(); } catch (Exception e) { e.printStackTrace(); } } static class SearchDevice extends Thread { InetAddress ia; int port; SearchDevice(String IPaddr, int Port) { try { ia = InetAddress.getByName(IPaddr); port = Port; } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { String msg = "Hello, ELECS!"; try { DatagramSocket ds = new DatagramSocket(); int length = msg.length(); byte[] msgbyte = msg.getBytes(); DatagramPacket dp = new DatagramPacket(msgbyte, length, ia, port); ds.send(dp); ds.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } | cs |
결과
300x250
'프로그래밍 팁' 카테고리의 다른 글
Fedora에 이전 버전의 OpenJDK 설치하기(Install OpenJDK 7 in Fedora 23) (0) | 2015.12.22 |
---|---|
OpenCV 최신 버전에서 Python으로 SIFT, SURF 사용하기(Install OpenCV 3.0 in Ubuntu) (2) | 2015.11.18 |
[JAVA] Socket 서버 구현시 안전하게 SocketServer를 종료하는 방법 (3) | 2015.10.14 |
[C/C++]thread 조건변수 다루기 - pthread_cond_broadcast() (0) | 2015.09.01 |
[JAVA]JDWP(Java™ Debug Wire Protocol) (0) | 2015.08.21 |