소켓 프로그래밍
package main;
import java.net.InetAddress;
public class Main {
public static void main(String[] args) {
InetAddress ip = null;
try {
ip = InetAddress.getByName("www.google.com");
System.out.println("호스트 이름: " + ip.getHostName());
System.out.println("호스트 주소: " + ip.getHostAddress());
System.out.println("내 주소: " + InetAddress.getLocalHost().getHostAddress());
} catch (Exception e) {
e.printStackTrace();
}
}
}
컨트롤 쉬프트 O 를 누르면 import 부분이 생긴다
InetAddresss ip 값을 생성해주고 try catch 문을 이용한다
구글의 호스트 이름 주소 그리고 내 주소까지 출력해주고
만약 에러가 나면 그것을 추적하는것 까지 해준다
어떠한 전기 제품과 전선을 이어주는 역할을 하는것 자체를 소켓이라고 한다
프로그래밍에서도 마찬가지로 어떠한 연결 도구로써 작동을 한다
일반적으로 거의 모든프로그램은 서버를 가지고 있다
소켓 프로그램은 여러개 프로그램들이 서로 통신을 할 수 있게 만들어주는 하나의 프로그램인 규칙이라 할 수 있다
새로운 프로젝트 두개를 만들어주자
1. Client 2. Server 이렇게 만들어준다
둘다 main이라는 패키지 안에
Client는 Client 와 Main 클래스를 만들어주고
Server는 Server 와 Main 클래스를 만들어준다
Server의 Server.java를 먼저 작성하자
package main;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private BufferedReader reader;
private ServerSocket server = null;
private Socket socket;
public void start() {
try {
server = new ServerSocket(12345);
System.out.println("서버가 활성화되었습니다.");
while (true) {
socket = server.accept();
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
getMessage();
}
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if (reader != null) reader.close();
if (socket != null) reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void getMessage() {
try {
while (true) {
System.out.println("클라이언트: " + reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client의 Client.java
package main;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private PrintWriter writer;
private Socket socket;
public void start() {
try {
socket = new Socket("127.0.0.1", 12345);
System.out.println("서버에 접속했습니다.");
writer = new PrintWriter(socket.getOutputStream(), true);
Scanner scan = new Scanner(System.in);
while (true) {
writer.println(scan.next());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Server의 Main.java
package main;
public class Main {
public static void main(String[] args) {
Server server = new Server();
server.start();
}
}
Client의 Main.java
package main;
public class Main {
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
이렇게 해주고 두 프로젝트의 Main.java를 둘 다 실행시켜주자
클라이언트로 입력하면 서버로 들어오는 것을 볼 수 있다
단어 단위로 데이터를 끊어서 보내도록 writer.println(scan.next()); 이렇게 만들어 놓았다
소켓 프로그램을 이용해서 작성한 것들은 실직적으로는 어떠한 패킷의 형태로써 서버와 클라이언트가
서로 데이터를 주고 받는것
물론 실제 패킷 안에 들어가 있는 정보들은 어떠한 바이트 스트림으로써 16진수 등으로 표현되어 있다
이것을 하나하나 계산하기 힘드니 우리가 쓰는것은 Socket 라이브러리를 사용한다
DNS 같은 경우는 특정한 호스트 이름을 가지고 실제 ip주소를 알아내는 하나의 프로토콜