TCP protocol
전송 제어 프로토콜(Transmission Control Protocol) 이다.
전공수업에 너무 자주들은 OSI 7 레이어 중에 4계층인 전송계층에 속하는 중요 프로토콜로
네트워크 망에 연결된 컴퓨터의 프로그램 간 데이터를 순서대로, 에러없이 교환할 수 있게 하는 역할이다
TCP의 특징
- 연결형(connection-oriented) 프로토콜: 연결 설정 후 통신 가능
- 신뢰성 있는 데이터 전송: 데이터를 재전송
- 일대일 통신(unicast)
- 데이터 경계 구분 안함: 바이트 스트림(byte-stream) 서비스
UDP의 특징
- 비연결형(connectionless) 프로토콜: 연결 설정 없이 통신 가능
- 신뢰성 없는 데이터 전송: 데이터를 재전송하지 않음
- 일대일 통신(unicast), 일대다 통신(broadcast, multicast)
- 데이터 경계 구분: 데이터그램(datagram) 서비스
결국엔 TCP 통신은 데이터를 정확하고 안전하게 전송이 가능하다 그랗기에 많이 통신할때 사용한다.
그럼 콘솔로 간단한 TCP 프로토콜 채팅을 만들어보자
클라이언트는 소켓을 통해 데이터를 전송하고 서버는 데이터소켓을 통해서 연결을 수락하고 통신을 한다
Client.java
package Network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ProtocolClient {
private Socket socket;
private BufferedReader br;
private BufferedWriter bw;
private BufferedReader keyboard;
public ProtocolClient() {
try {
socket = new Socket("172.20.10.7",9500);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//서버로 받는거
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //서버로 보내는거
keyboard = new BufferedReader(new InputStreamReader(System.in));
}catch(UnknownHostException e) {
e.printStackTrace();
System.out.println("서버를 찾을수 없습니다.");
System.exit(0);
}catch(IOException e) {
System.out.println("서버와 연결이 안됩니다");
System.exit(0);
e.printStackTrace();
}
String msg=null;
String line = null;
while (true) {
try {
// server로 보내는쪽
msg = keyboard.readLine();
bw.write(msg + "\n"); // 엔터를 보내는이유는 서버쪽에서 readLine할때 엔터찾아 삼만리
bw.flush();
// server로 받는쪽
line = br.readLine();
System.out.println(line);
// "200:angel" - > 200 , angel 로 분리
String[] ar = msg.split(":");
if (ar[0].equals(Protocol.EXIT)) {
br.close();
bw.close();
socket.close();
keyboard.close();
System.exit(0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new ProtocolClient();
}
}
Server.java
1.클라이언트가 접근하기를 기다린다 (블록킹)
2.클라이언트와 연결할 소켓을 생성한다 -accept();
package Network;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ProtocolServer {
private ServerSocket ss;
private BufferedReader br;
private BufferedWriter bw;
private Socket socket;
public ProtocolServer() {
try {
ss = new ServerSocket(9500);
System.out.println("서버준비완료");
socket =ss.accept();//클라이어느가 둘이상이면 무한루프
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String line = null;
while(true) {
//받는쪽
line = br.readLine();
//보내는쪽
String[] ar = line.split(":");
if(ar[0].equals(Protocol.ENTER)) {
bw.write(ar[1] +"님 입장하셨습니다.\n");
bw.flush();
}else if(ar[0].equals(Protocol.EXIT)) {
bw.write(ar[1] +"님 퇴장하셨습니다.\n");
bw.flush();
br.close();
bw.close();
socket.close();
System.exit(0);
}else if(ar[0].equals(Protocol.SEND_MESSAGE)){
bw.write("[" + ar[1] +"] " +ar[2]+"\n");
bw.flush();
}
}
} catch (IOException e) {
System.out.println("클라이언트와 연결이 안되었습니다.");
e.printStackTrace();
System.exit(0);
}
}
public static void main(String[] args) {
new ProtocolServer();
}
}
결과
'Java' 카테고리의 다른 글
제네릭의 모든것 (0) | 2020.08.08 |
---|---|
객체직렬화 ? (0) | 2020.02.23 |
디자인패턴(템플릿 메소드 패턴 / 팩토리 메소드 패턴) (0) | 2019.12.16 |
Thread를 이용한 실시간 시계 (0) | 2019.12.14 |
Comparable , Comparator (0) | 2019.12.14 |