네트워크 통신

jinkyung·2021년 1월 15일
0

JAVA2

목록 보기
33/35

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();
	}
}

0개의 댓글

관련 채용 정보