Search
🌐

소켓 프로그래밍

1. 유용한 클래스

가. InetAddress

InetAddress Class: IP주소를 다루기 위한 클래스
→ 호스트 IP주소, 호스트 이름, 로컬IP주소 등등
try { InetAddress inetAddress = InetAddress.getByName("www.naver.com"); System.out.println(inetAddress.getHostAddress()); }catch (UnknownHostException e){ e.printStackTrace(); } // 출력결과 // 223.130.195.200 // www.naver.com
Java
복사

나. URL

URL Class: URL의 구성요소를 다루기 위한 클래스
URL 구성요소
→ 'http://www.naver.com:80/sample/hello.html?referer=code#index1'
→ 프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조
→ 클래스의 구체적인 사용법 https://docs.oracle.com/javase/7/docs/api/java/net/URL.html

다. URLConnection

URLConncection: URL과 App 간의 통신연결을 지원하는 클래스로 추상 클래스임
→ HttpURLConnection, JarURLConnection Class가 URLConnection 클래스를 구현함
URL url = null; BufferedReader input = null; String address = "https://docs.oracle.com/javase/7/docs/api/java/net/URL.html"; String line = ""; try { url = new URL(address); URLConnection connection = url.openConnection(); // 주석처리한 것과 같이 간략화할 수 있음 // input = new BufferedReader(new InputStreamReader(url.openStream())); InputStream in = connection.getInputStream(); input = new BufferedReader(new InputStreamReader(in)); while((line=input.readLine()) != null){ System.out.println(line); } input.close(); } catch (Exception e) { e.printStackTrace(); }
Java
복사

2. TCP 소켓 프로그래밍

가. 소켓

소켓(Socket): 프로세스간의 통신을 담당, InputStream과 OutputStrea을 가지고 있으며 상대의 각각의 Stream과 교차하여 프로세스간 입출력(통신)이 가능해짐
서버소켓(ServerSocket): 서버 프로그램에서 클라이언트의 연결 요청을 준비하는 소켓, 하나의 포트에 하나의 서버소켓이 결합됨

나. TCP 소켓 통신 과정

서버의 연결 요청 처리 준비) 서버 프로그램에서 서버소켓으로 연결 요청에 대한 처리를 준비함. → 서버소켓은 서버의 특정 포트와 결합되어 있음
클라이언트의 연결 요청) 클라이언트는 소켓을 생성해서 서버에 연결을 요청함. → 클라이언트는 서버의 IP주소와 포트번호를 기반으로 연결 요청
서버의 연결 수락) 서버는 클라이언트의 연결 요청을 받아서 서버에 새로운 소켓을 생성함.
통신) 서버에서 새롭게 생성한 소켓과 클라이언트의 소켓이 연결되어 1:1 통신을 시작함
// Server side ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(7777); System.out.println("서버: 연결 준비 완료"); } catch (IOException e){e.printStackTrace();} while(true){ try { System.out.println("연결 요청 대기"); Socket socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + "로부터 연결 요청 들어옴"); // 출력 스트림 생성 OutputStream out = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); // client의 socket에 데이터 전송 dos.writeUTF("TEST Message from Server"); System.out.println("데이터 전송 완료"); dos.close(); socket.close(); } catch (IOException e){e.printStackTrace();} }
Java
복사
// Client Side try { String serverIp = "127.0.0.1"; System.out.println("서버에 연결 중"); Socket socket = new Socket(serverIp, 7777); InputStream in = socket.getInputStream(); DataInputStream dis = new DataInputStream(in); System.out.println("from server: " + dis.readUTF()); System.out.println("연결 종료"); dis.close(); socket.close(); }catch (Exception e){e.printStackTrace();}
Java
복사

3. UDP 소켓 프로그래밍

Reference

남궁성, 자바의 정석 3rd Edition