불로구

JAVA - TCP 소켓 프로그래밍 본문

프로그래밍/JAVA

JAVA - TCP 소켓 프로그래밍

맹이맹이 2021. 4. 19. 14:06
반응형
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에 대해 기본 인코딩을 사용하는 객체를 생성

반응형
Comments