불로구
JAVA - TCP 소켓 프로그래밍 본문
TCP란?
- Server & Client간 신뢰성 있는 연결을 위해 만들어진 프로토콜
- 3 핸드셰이킹을 통한 연결을 통한 연결지향 프로토콜
- 네트워크상에서 데이터가 전달될 때 손실이 발생 시 손실을 검색하고, 재조합
특징
- 신뢰성 : 신뢰성을 위한 적극적 수신 및 통지, 재전송 시스템을 지원
- 흐름제어 : 송신 데이터의 양을 제어하는 매커니즘 구현
- 다중성 : TCP는 한 라우터의 많은 프로세스가 TCP 통신 서비스를 동시에 사용 가능
- 연결지향성 : 3핸드셰이킹을 통한 메시지 교환
- 양방향 : 하나의 전송선로에서 데이터가 동시에 양방향으로 전송 가능
헤더
서버 구현
1. ServerSocket 생성
2. ServerSocket의 accept() 대기
3. 클라이언트의 접속 시도가 있을 경우 accept()에서 socket 반환
4. Socket으로부터 InputStream , OutputStream 구함
5. InputStream, OutputStream을 이용하여 통신
6. Socket의 close()로 소켓 닫음
package server;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Main {
static final int port = 8857;
static OutputStream out;
static InputStream in;
static BufferedReader br;
static PrintWriter pw;
static String data;
public static void main(String[] args) {
try {
// 소켓 생성
ServerSocket server = new ServerSocket(port);
System.out.println("====== 소켓 생성 ======");
System.out.println("====== 접속 대기중.... ======");
//accept를 통한 접속 대기
Socket socket = server.accept();
InetAddress inet = socket.getInetAddress(); //접속자 ip 정보 get
System.out.println("접속됨 -> IP : " + inet );
//반환받은 소켓으로부터 in/outputStream 구하기
out = socket.getOutputStream();
in = socket.getInputStream();
//BufferedReader, PrintWriter 형식으로 변경
br = new BufferedReader(new InputStreamReader(in));
pw = new PrintWriter(new OutputStreamWriter(out));
//클라이언트가 보내는 문자열 한 줄 읽기
while((data = br.readLine()) != null) {
System.out.println("전송받은 데이터 : " + data);
//클라이언트로 다시 전송
String response = "hello";
pw.println(response);
pw.flush();
}
pw.close();
br.close();
socket.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
클라이언트
1. Socket 생성
2. Socket으로부터 InputStream과 OutputStream 구함
3. InputStream, OutputStream을 이용하여 통신
4. Scoket의 close()로 소켓 닫음
package client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class Main {
static final String ip = "IP주소";
static final int port = 8857;
static BufferedReader br; // 클라이언트 입력
static BufferedReader receive_br; // 서버로 받은 값
static OutputStream out;
static InputStream in;
static PrintWriter pw;
static String response;
public static void main(String[] args) {
try {
Socket socket = new Socket(ip, port); // 소켓 생성
br = new BufferedReader(new InputStreamReader(System.in));
System.out.println(socket.getInetAddress() + " , " + socket.getPort());
// InputStream, OutputStream 구하기
out = socket.getOutputStream();
in = socket.getInputStream();
// 형변환
pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out)));
receive_br = new BufferedReader(new InputStreamReader(in));
while (true) {
System.out.print("데이터 입력 : ");
String data = br.readLine();
if (data.equals("end")) {
break;
}
pw.println(data);
pw.flush();
// 서버의 반환값을 읽음
response = receive_br.readLine();
System.out.println("서버에서 온 응답 : " + response);
}
pw.close();
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
스트림
InputSteam : 바이트 단위로 입력받기 위한 최상위 클래스
OutputStream : 바이트 단위로 출력하기 위한 최상위 클래스
Reader : 문자 단위 입력 스트림
Writer : 문자 단위 출력 스트림
InputStreamReader(InputStream in) : 주어진 입력 바이트 스트림 in에 대해 기본 인코등을 사용하는 객체 생성
OutputStreamWriter(OutputStream out) : 주어진 출력 바이트 스트림 out에 대해 기본 인코딩을 사용하는 객체를 생성
'프로그래밍 > JAVA' 카테고리의 다른 글
객체지향이란? - solid 원칙 (2) (0) | 2021.04.27 |
---|---|
객체지향(OOP)란? (1) (0) | 2021.04.27 |
30강. (JAVA) 자바 - 중첩 인터페이스 (0) | 2021.03.16 |
[SpringFramework] - SpringSecurity를 이용한 로그인 설정 (0) | 2021.03.09 |
29강. (JAVA) 자바 - 중첩 클래스 (0) | 2020.06.30 |