아 이거 이해하겠다고 대가리 깨지는 줄 알았다 시발
그만큼 힘들었으니 야무지게 적어보겠다.
Socket
- Socket 클래스는 client에서 서버로 접속하거나 Server에서 accept 하는데 필요한 클래스이다.
- 소켓을 활용하여 7계층에서 4계층까지의 작업을 단순화 할 수 있다.
- 소켓을 통해 서버와 클라이언트가 통신이 가능하다.
- 소켓을 통해 통신을 체결하고 이후 스트림을 통해 서버와 클라이언트가 데이터를 주고 받는다.
ServerSocket
java에서 서버 프로그램을 개발할 때 쓰이는 클래스이다.
Stream // import java.io.* 의 주요 클래스
바이트 기반 스트림 | 문자 기반 스트림 | |||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스 | FileInputStream | FileOutputStream | InputStreamReader | OutputStreamWriter |
DataInputStream | DataOutputStream | BufferedReader | BufferedWriter |
- 바이트단위 입출력 스트림 : 그림, 멀티미디어, 문자 등 모든 종류의 데이터들을 주고받을 수 있다.
- 문자단위 입출력 스트림 : 오로지 문자만 주고받을 수 있게 특화되어 있다.
하위 클래스 세부 설명
FileInputStream / FileOutputStream | 다른 입력 클래스들과 연결해서 바이트 단위로 데이터를 읽어오는 클래스 |
DataInputStream / DataOutputStream | 자바의 기본 데이터 타입에 해당하는 데이터를 바이트 단위로 파일에 쓰기 위한 클래스 |
InputStreamReader / OutputStreamWriter | 문자 단위 입출력을 위한 하위 스트림 클래스 |
BufferedReader / BufferedWriter | Input&OutputStreamReader 에 버퍼링 기능이 추가된 클래스 |
Server
package day06;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
// 양방향 1회통신 , 클라이언트가 먼처 입력 후 서버가 후 입력
public class ServerChatMain {
public static void main(String[] args) {
try { // Socket 클래스를 사용시 try - catch를 해주어야함
// ServerSocket 클래스를 통해 serverSocket을 생성한다.
// 1. 지정한 포트와 소켓을 바인딩 해주고 포트를 LISTEN 상태로 변경해준다.
ServerSocket serverSocket = new ServerSocket(9999);
// 3. 서버는 클라이언트의 접속을 수신한다.
// 클라이언트의 접속을 승인히고 접속되면 접속된 클라이언트의 IP주소를 출력
Socket clientSocket = serverSocket.accept();
System.out.println(clientSocket.getInetAddress()+"와 접속되었습니다.");
// 5. 서버가 클라이언트에게 데이터를 받아오기 위한 과정
// 5-1. 서버도 클라이언트가 보낸 데이터를 수신하는 스트림을 개설한다.
// 입력받는 코드
InputStream is = clientSocket.getInputStream(); // byte(바이트) 단위 입출력을 위한 최상위 스트림 클래스
InputStreamReader isr = new InputStreamReader(is); // 문자 단위 입출력을 위한 하위 스트림 클래스
BufferedReader br = new BufferedReader(isr); // 동일한 보조 스트림이지만
// InputStreamReader에 버퍼링 기능이 추가된 클래스
String data = br.readLine(); // 버퍼에 저장된 문장단위로 읽어서 저장하고
System.out.println(data); // 저장한 문자를 출력한다.
// 입력받는 코드 끝
// 보내는 코드
OutputStream os = clientSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bow = new BufferedWriter(osw);
Scanner scanner = new Scanner(System.in);
String text = scanner.nextLine();
bow.write(text+"\n");
bow.flush();
// 보내는 코드 끝
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
Client
package day06;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ClientChatMain {
public static void main(String[] args) {
try { // Socket 클래스를 사용시 try - catch를 해주어야함
// 서버로 접속하는 코드
// 2. 서버로 접속하기 위한 소켓을 생성하여 접속을 시도한다.
// 이때 서버에서 개방한 포트의 정보를 입력한다. Ip주소와 port 번호가 해당됨
Socket clientSocket = new Socket("192.168.0.213", 9999);
// 4. 클라이언트가 서버에게 데이터를 보내기위한 과정
// 4-1. 클라이언트가 서버에게 데이터를 송신하는 스트림을 개설한다.
// 보내는 코드
OutputStream os = clientSocket.getOutputStream(); // byte(바이트) 단위 입출력을 위한 최상위 스트림 클래스
OutputStreamWriter osw = new OutputStreamWriter(os); // 문자 단위 입출력을 위한 하위 스트림 클래스
BufferedWriter bow = new BufferedWriter(osw); // 동일한 보조 스트림이지만
// OutputStreamReader에 버퍼링 기능이 추가된 클래스
Scanner scanner = new Scanner(System.in); // 보낼 문자를 입력받는다
String text = scanner.nextLine(); // 보낼 문자를 입력받는다
bow.write(text+"\n"); // 버퍼에 입력한 문자를 저장하고 끝을 알려주어야 정상적으로 출력 가능하다.
bow.flush(); // 다시 버퍼를 초기화 해준다.
// 보내는 코드 끝
// 입력받는 코드
InputStream is = clientSocket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String data = br.readLine();
System.out.println(data);
// 입력받는 코드 끝
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
참고
'Java' 카테고리의 다른 글
[Java] JSP (Intellij + Tomcat) 실습 (2) | 2023.12.02 |
---|---|
[Java] JDBC (0) | 2023.11.30 |
[Java] 추상클래스 vs 인터페이스 (2) | 2023.11.29 |
[Java]Non-Access Modifier(final,static,abstract) (0) | 2023.11.29 |
[Java] 인터페이스 (Interface) (2) | 2023.11.29 |