본문 바로가기

아옳옳의 코딩공부/아옳옳 자바코딩공부

2021-05-17안드로이드공부(네트워크 프로그래밍)

반응형

네트워크에 관해서는 사실 전문적으로 공부를 하게 되면 거의 한 학기 급으로 많은 분량이다. 

우리는 기본적인 지식을 가지고 활용하는게 목적이니 최소한으로 알아야 할것들만 공부해보도록 하자 

 네트워크가 무엇일까?  네트워크 기초 

@여러대의 컴퓨터를 통신 회선으로 연결하는 것 

.홈 네트워크 : 컴퓨터가 방마다 있고. 이들 컴퓨터를 유.무선 등의 통신회선으로 연결

.지역 네트워크: 회사 , 건물, 특정 영역에 존재하는 컴퓨터를 통신 회선으로 연결한 것 

.인터넷: 지역 네트워크를 통신 회선으로 연결한 것 

 

@서버와 클라이 언트 

나는 비 전공자이라서 이런 용어들이 생소하고 뭐가 뭔지 알기가 쉽지 않다 .... 그래서 일단 교재에 나온 내용들 정리하고 생각날때마다 보자 ...  

 

이클립스로 아이피 주소 알아내기 

	public static void main(String[] args) {
		
		try {
			//내 아이피 주소 알아내기 
			InetAddress local = InetAddress.getLocalHost();
			System.out.println("내 컴퓨터 Ip 주소 :" +local.getHostAddress());
			
			//상대방 아이피 주소 알아내기
			InetAddress[] iArr = InetAddress.getAllByName("www.naver.com");
			for(InetAddress ia : iArr) {
				System.out.println("www.naver.com Ip주소 :" +ia.getHostAddress());
			}
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

이렇게 자바에서도 알아낼수 있고 cmd 를 이용하여 알아낼수 도 있다. 

 


네트워킹 방식 TCP & UDP

TCP네트워킹

우리의민속놀이 스타크래프트 할때 하던 배틀넷이 TCP 컴터끼리 연결해서 하는 게 UDP라고 단순하게 생각하자 ( 그래도 아직 잘 모르겠어..... ) 

 

사실 이거 글읽어도 잘 모르겠다... 너무 전문적인 용어들같아서 나같은 비전공자들은 이렇게 이해 하는거보다 코드를 작성해보면서 어떻게 흘러가는지 이해하는게 더 중요할거 같다.... 

(오늘은 완전 복붙인데.... 어쩔수가... 내가 뭐라 할말이 없다.... ) 

 

 

일단 이론적인것은 이정도로 하고 그림으로 구조를 살펴 보자 

그림에서 보이는 것처럼 클라이언트쪽에서 서버 ip , 서버 port 를 가지고 소켓인스턴스 생성해준다.  

서버쪽에서는 서버소켓을 생성해주고 , 소캣에 listener.accep() 해서 오기를 기다려준다. 

그럼 우리가 전에 배웠던 파일 입출력으로 상호간 데이터 입출력해주면 되는것이다. 

 

그럼 코드를 보면서 실제로 어떻게 사용하고 작동하는지 보자 

 

정확한 확인을 위하여 다른 프로젝트로 만들어 실습해 보았다. 

서버

public class Server_Ex {
    public static void main(String[] args) {
        BufferedReader in = null; // 보낸것 읽어오기위함 
        BufferedReader stin = null; //키보드에 읽어오기위함
        BufferedWriter out = null; // 쓰기위함
        ServerSocket listener = null; // 서버소켓
        Socket socket = null; // 소켓 

        System.out.println("연결 대기중..\n");

        try{
            listener = new ServerSocket(9999); // 포트번호 
            
            socket = listener.accept(); //소켓에 accept해주어 기다리기 
            
            System.out.println("클라이언트와 연결됨");
            
            // 각 스트림 인스턴스화
            in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 클라이언트로부터의 입력스트림
            stin = new BufferedReader(new InputStreamReader(System.in)); // 키보드로부터의 입력스트림
            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 클라이언트로의 출력 스트림

            String inputMessage;
            
            while(true){
            	
                inputMessage = in.readLine(); // 한줄 읽어오기 
                //클라에서 보낸 메시지가 bye 라면 종료 함 
                if(inputMessage.equalsIgnoreCase("bye")) break;
                //아니라면 클라가 보낸 메세지 출력하고 
                System.out.println(inputMessage);
                System.out.print(">");
                //내가 키보드에 작성한거 받아와서 outputStream으로 보내주기 
                String outputMessage = stin.readLine();
                out.write("서버>"+outputMessage+"\n");
                out.flush();

            }

        } catch (IOException e){
            System.out.println(e.getMessage());
        } finally {
            try {
                socket.close();
                listener.close();
            } catch (IOException e){
                System.out.println("클라이언트와 채팅 중 오류가 발생했습니다.");
            }
        }

    }
}

클라이언트

public class Client_Ex {
    public static void main(String[] args) {
    	
        BufferedReader in = null; // 서버로부터 읽기 버퍼 
        BufferedReader stin = null; // 키보드로부터 읽기 버퍼
        BufferedWriter out = null; // 쓰기 버퍼
        Socket socket = null; // 소켓

        try {
            socket = new Socket("localhost", 9999); // 클라이언트 소켓 생성 서버ip, 서버port
            in = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 서버로부터의 입력 스트림
            stin = new BufferedReader(new InputStreamReader(System.in)); // 키보드로부터의 입력 스트림
            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 서버로의 출력 스트림

            System.out.println("서버와 연결되었습니다.");
            
            String outputMessage;
            
            while (true) {
                System.out.print(">");
                outputMessage = stin.readLine(); // 키보드에서 한 행의 문자열 읽음
                //equalsIgnoreCase 대소문자 구별 이퀄스
                if (outputMessage.equalsIgnoreCase("bye")) { // "bye"가 입력되면 메시지 전송 후 연결 종료
                    out.write(outputMessage);
                    out.flush();
                    break;
                }
                out.write("클라이언트>" + outputMessage + "\n"); // 키보드에서 읽은 문자열 전송
                out.flush();
                String inputMessage = in.readLine(); // 서버에서 한 행의 문자열 읽음
                System.out.println(inputMessage); // 서버가 보낸 메시지 화면에 출력
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        } finally {
            try {
                socket.close(); // 클라이언트 소켓 닫기
            } catch (IOException e) {
                System.out.println("서버와 채팅 중 오류가 발생했습니다.");
            }
        }

    }
}

보면 서버와 클라이언트를 번갈아가며 메세지가 실행되는것을 볼수 있다. 

기본적으로 파일입출력으로 하기때문에 어려운것 없지만 실제로 활용하기위해서는 많이 어려운거 같다... 

지금 활용하는게 가장 기본적으로 사용한것이니 이거 잘 기억하자 

 

반응형