TCP : 컨베이어벨트 시스템, 정확성이 높다.
why? 상대방이 받을때까지 가니까 but 속도 느림
UDP : 속도 중시 , 정확도 떨어짐 ex ) 멀티미디어 방송
TCP가 훨씬 더 많이 쓰인다!
ip는 해당되는 호스트에게 찾아감 어떤것을 만날 지는 port로 결정
몇번 포트를 열어놨느냐에따라 그 포트로!
우리는 직접 못하고 jvm,os의 힘을 빌려야 함
밑단까지 택배를 보내려면 소켓이 필요하다
(TCP/UDP는 이미 만들어져 있음!)
에코 - 통신이 잘됐는지 확인하기 위함.
서버는 꼭 닫아줘야함
package ex07.network.echoServer00;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
<서버는 서비스를 제공하는 프로그램을 일컫는다>
TCP > UDP 신뢰성이 더 중요!
1)고정된 주소를 가진다 (주소를 부여 - 그래야 찾아오니까)
2)접속을 요청하는 클라이언트를 받아줘야한다 (accept)
3)요청을 받아들이면 송수신 스트림이 형성된다
4)스트림이 형성되는 통신이 가능하다
5)작업이 완료되는 close를 통해 스트림을 해제한다
*/
public class EchoServer {
public static void main(String[] args) throws IOException { // 웬만하면 try catch로 해야함
// 1) 소켓 객체를 생성(클라이언트가 찾아올수 있도록 주소,통신방식을 알려줘야함 )
// 소켓은 TCP에 존재, 주소(ipconfig)까지는 우리가 정하지 x, port만 지정 (우리가정해줘야함)
// 객체가 생성될 때 TCP layer와 연결이 되어진다.
// VIPS 입구에 안내 매니저
ServerSocket serverSocket = new ServerSocket(9000); // port번호
// 2) 클라이언트의 접속을 기다린다
// accept() 메서드가 접속 전까지 return을 안한다.
// VIPS 자리 직접 셋팅/ 주문받는 직원 (클라이언트와 직접 통신하는 직원)
// accept()가 리턴되면 클라이언트가 연결된 상태로 인식한다.
// 소켓은 휴대폰 전화기에 해당한다. 연결됐다 = 전화가 걸린상태로 받았다.
System.out.println("클라이언트의 접속 대기...");
Socket conSocket = serverSocket.accept();
// 3) 상대방의 연결 정보를 확인해보자 (어떤 주소로 접속했다는 것을 확인 )
InetAddress inetAddr = conSocket.getInetAddress();
System.out.println(inetAddr.getHostAddress() + "접속");
// 4)연결이 완료됐으므로 연결스트림이 완성되어 통신 가능
// 전송을 위한 스트림과 객체 연결
OutputStream out = conSocket.getOutputStream(); // 서버 -> 클라이언트
OutputStreamWriter outW = new OutputStreamWriter(out);
PrintWriter pw = new PrintWriter(outW); // 송신 객체(마이크) filter 클래스 --편리하게 통신하기 위해.
// 수신을 위한 스트림과 객체 연결
InputStream in = conSocket.getInputStream();
InputStreamReader inR = new InputStreamReader(in);
BufferedReader br = new BufferedReader(inR); // 수신 객체(스피커)
while (true) {
// 클라이언트가 보내는 메시지를 수신대기한다.
// readLine()이 return되면 메시지를 line에 저장한다.
String line = br.readLine();
if (line == null) { // 연결이 끊어지면
System.out.println("클라이언트와 연결x ");
break;
} else {
System.out.println("클라이언트로부터 수신 : " + line);
// 클라이언트한테 echo전송
pw.println(line);// 전송 메시지를 버퍼에 저장
pw.flush(); // 버퍼데이터 즉시 전송
}
}
System.out.println("클라이언트 - 서버 연결 종료 ");
pw.close();
br.close();
conSocket.close();
}
}
클라이언트
package ex07.network.echoClient01;
import java.io.*;
import java.net.*;
/*
<클라이언트 프로그램 >
1) 서버의 주소(ip, port )를 가지고 소켓 생성 (내부적으로 Connect 진행)
2) 접속 후에 전송
3) 서버가 Echo 서버니까 보낸 데이터가 다시 그대로 돌아온다
4) 접속 중단은 close() 호출
*/
public class EchoClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1) 서버 연결 소켓 생성
//127.0.0.1 : local host, 내 호스트(나 자신)의 주소
//또는 ipconfig로 내 주소 확인 후 입력
//객체 생성시 생성자 내부에서 서버에 Connect 진행 후 연결
Socket clientSocket = new Socket("127.0.0.1",9000); //서버와 동일한 포트, 연결된 상태
//2) 사용자의 입력을 받는 객체 생성
InputStreamReader inK =new InputStreamReader(System.in);
BufferedReader keyboard = new BufferedReader(inK);
//3) 소켓 객체로부터 송수신 스트림 객체 얻기
//송신
OutputStream out = clientSocket.getOutputStream();
OutputStreamWriter outW = new OutputStreamWriter(out);
PrintWriter pw = new PrintWriter(outW);
//수신
InputStream in = clientSocket.getInputStream();
InputStreamReader inR = new InputStreamReader(in);
BufferedReader br = new BufferedReader(inR);
//4) 무한루프를 돌려서 사용자 입력 후 서버로 메시지 전송
while(true) {
System.out.print("입력 >>");
String line = keyboard.readLine();
if(line == null) {
System.out.println("서버 종료 ");
break;
}
else if(line.equals("quit")) { //quit 입력하면 종료
System.out.println("클라이언트 Quit ");
break;
}
System.out.println("서버로 전송 : " + line);
pw.println(line);
pw.flush(); //버퍼데이터 즉시 전송
//서버가 echo하는 것을 받아서 출력
String echo = br.readLine();
System.out.println("서버로부터 수신 : " + echo);
}
// 5) 열려있는 객체들을 모두 닫는다
pw.close();
outW.close();
out.close();
br.close();
inR.close();
in.close();
clientSocket.close();
}
}