본문 바로가기

programming/Gukbi

국비 교육 30일차 - 네트워크

728x90
반응형

자바가 분명 끝나가고 있는데

마지막이 왜 이리 어려운지요

 

package com.sist.network;
/*
 *   자바 네트워크 (인트라넷,인터넷 연결한후에 통신)
 *      자바 => 사내메신저 
 *      자바 => 화면 UI , C => 서버
 *      ======================== 예) 카톡  
 *   TCP  =========> 전화
 *    1) 연결성 
 *    2) 신뢰성 
 *    3) 속도 저하 
 *    4) => FTP , SMTP , TELNET , HTTP(웹) 
 *   UDP  =========> 우편
 *    1) 비연결성 
 *    2) 신뢰성이 없다 
 *    3) 속도가 빠르다 
 *    4) => 게임 , 멀티미디어 (화상) => 24프레임
 *   
 *   등기 => TCP / UDP
 *          연결성,신뢰성,속도 => RTCP
 *          
 *   자바에서 네트워크 => 
 *       식별자 : IP(전화번호) , PORT (연결선)  => 서버(IP:고정) , 클라이언트(유동)
 *              ==========================
 *              PORT : 0~65535 (0~1023 사용중)
 *              FTP(21) , SMTP(25) , TELNET(23) , HTTP(80) , 오라클서버(1521)
 *              MS-SQL(1433) , 몽고디비(27017) , 8080,4000    
 *   1) 서버제작 
 *       1:다 , 1:1 (프로그램 , 서버,클라이언트) : 화상 , 게임 
 *       ====
 *       1. 접속을 받는 프로그램 => 저장 
 *       2. 접속자마다 따로 통신이 가능하게 만든다 (쓰레드 : 통신)
 *          class Server
 *          {
 *              접속자 정보 저장
 *              class 통신 extends Thread
 *              {
 *                
 *              }
 *          }
 *          http://www.daum.net/aaa/index.html
 *          *** Socket : 연결기계 (핸드폰) 
 *          접속을 당당하는 클래스
 *            ServerSocket
 *             1) ip,port를 연결한다 bind() => 개통 
 *             2) 대기 상태  => listen()
 *             3) 연결      => accept() => ip(발신자의 전화번호) => 저장 
 *             4) 응답 => 요청 내용 read()
 *             5) 응답 => write()
 *          통신을 담당하는 클래스
 *            Socket  
 *   2) 클라이언트 연결 방법 
 *        접속 => 요청 => 응답 받아서 출력 
 */
import java.io.*;
import java.net.*;
// 1. URL 
/*
 *     http://www.daum.net/movie/list.jsp => URL
 *                        =============== URI
 *     = URLConnection : 웹서버에 접근 
 *     = URLEncoder : 한글변환  ===> encoding ==> decoding => %EC%9E%90%EB%B0%94=자바
 *                                ==========
 *                                 getBytes() 자바 = %EC%9E%90%EB%B0%94
 *                                 oq=자바
 *     1. 브라우저 , 네트워크 => 1byte : 1byte를 변환 getByte() ===> 서버에서 
 *     https://www.google.com/search?q=%EC%9E%90%EB%B0%94&rlz=1C1CHBD_koKR933KR933&oq=oq=자바&aqs=chrome..69i57j69i59j35i39j0i395i433j0i131i395i433j0i395j0i395i433j0i395.4281j1j15&sourceid=chrome&ie=UTF-8
 */
// 2. Socket , ServerSocket
// https://search.naver.com/search.naver?where=news&query=%EC%98%81%ED%99%94
public class MainClass{

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        try
        {
        	URL url=new URL("http://newssearch.naver.com/search.naver?where=rss&query="
        			  +URLEncoder.encode("영화", "UTF-8"));
        	// URL 연결 
        	HttpURLConnection conn=(HttpURLConnection)url.openConnection();//naver에 연결 
        	if(conn!=null) // 연결되었다면 
        	{
        		BufferedReader in=new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
        		while(true)
        		{
        			String msg=in.readLine();
        			if(msg==null)// 읽을 내용이 없는 경우 
        			{
        				break;
        			}
        			System.out.println(msg);
        		}
        	}
        }catch(Exception ex){}
	}

}

서버 소켓 

클라이언트 소켓이 있고, 그 두개를 연결하는 과정을 네트워킹이라고 한다. 

 

1. 서버소켓

ServerSocket
 1) ip,port를 연결한다 bind() => 개통 
 2) 대기 상태  => listen()
 3) 연결 => accept() => ip(발신자의 전화번호) => 저장 
 4) 응답 => 요청 내용 read()
 5) 응답 => write()

 

서버소켓을 생성하기 위해서는 ip주소와 port번호를 지정해 주어야 한다. 그래서 생성이 된 것을 bind()라고 하고

생성이 된 후 누군가의 접속을 기다리는 상태를 listen(), 연결이 된 상태를 accept() 라고한다. 

 

package com.sist.network;
import java.io.*; // 네트워크 입출력 (C/S => Client : 요청 , 응답을 받아서 출력 , Server:요청을 받아서 처리후에 응답)
import java.net.*;
/*
 *   본인 => 서버 
 *          ===
 *          localhost , 127.0.0.1 , 211.238.142.181
 *          ======================  
 */
public class Server implements Runnable{
    // 접속 받는 클래스 
	ServerSocket ss;
	final int PORT=3355;// 0~65535(0~1023) => 화상(30000) , 음성(20000)  
	// 초기화 
	// 한개의 컴퓨타에서는 서버는 반드시 한번만 수행 
	// 여러번 수행도 가능 => PORT를 변경
	public Server()
	{
		try
		{
			ss=new ServerSocket(PORT);// 컴퓨터 IP는 자동 인식
			/*
			 *    => ip,port
			 *    => 개통 bind(ip,port) => 셋팅 완료 
			 *    => 클라이언트가 접근 대기 => listen()
			 */
			System.out.println("Server Start...");
		}catch(Exception ex) {ex.printStackTrace();}
	}
	// 클라이언트가 접속시 처리 => 정보 저장 
	public void run()
	{
		while(true)
		{
			try
			{
				Socket s=ss.accept(); // 접속이 된 샹태에서만 호출  ==> 발신자 정보 (ip,port=>Socket)
				System.out.println("Client IP:"+s.getInetAddress().getHostAddress());
				System.out.println("Client PORT:"+s.getPort());
				/*
				 *   서버  =======> port(고정)
				 *   클라이언트 ====> port(가변) => 자동 생성 
				 */
				// 클라이언트 메세지 전송 
				OutputStream out=s.getOutputStream();
				// s=> 클라이언트 
				out.write("안녕하세요!! 서버에 연결되었습니다\n".getBytes());//인코딩
			}catch(Exception ex){}
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Server server=new Server();
        new Thread(server).start();// server가 가지고 있는 run()을 호출 
	}

}

클라이언트 소켓

접속할 ip주소를 연결해주면 접속이 된다. 

 

 

Server와 Client를 연결하는 프로그램을 따로 만들어 봤다

 

package com.sist.practice;

import java.io.*;
import java.net.*;

public class Server {
	private ServerSocket serverSocket;
	private Socket clientSocket;
	
	// 데이터가 들어왔다 나가는 통로도 만들어 줘야함
	private DataInputStream dataInputStream;
	private DataOutputStream dataOutputStream;
	
	
	public void serverSetting() {
		try {
			// 생성과 바인드 ip, port 주소 할당
			// ip는 자동으로 localhost
			serverSocket = new ServerSocket(10002);
			// 연결이 된 상태 - 접속이 완료된 부분
			clientSocket = serverSocket.accept(); 
			System.out.println("클라이언트 소켓 연결됨");
			} catch (IOException e) {
			
			e.printStackTrace();
			}
		}
	
		
	
			
			public void streamSetting() {
				// 받아온 정보 입력
				try {
					dataInputStream = new DataInputStream(clientSocket.getInputStream());
					dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			
			
			
			
			
			
		
	public String dataRecv()
	{
		try {
			return dataInputStream.readUTF();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		return null;
	}
	
	public void dataSend(String sendData)
	{
		try {
			dataOutputStream.writeUTF(sendData);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	// 사용한 자원들을 모두 반납해주는 메소드
			public void closeAll()
			{
				
				try {
					serverSocket.close();
					clientSocket.close();
					dataInputStream.close();
					dataOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
	
	public Server() {
		serverSetting();
		System.out.println(dataRecv());
		dataSend("잘 받았습니다");
		closeAll();
	}
	
	public static void main(String[] args) {
		new Server();
	}
}
	

  서버에서 신경을 써야할게

먼저 소켓을 만들어 주어야하고, port를 설정해서 bind까지 완료해야한다. 

그 다음에는 클라이언트와 연결해준다. 

 

그 다음에는 받아온 정보를 입력해준다

데이터를 받고 보내는 메소들을 생성해주고, 서버 생성자를 만들어서 기능을 하나로 모아준다. 

 

package com.sist.practice;
import java.io.*;
import java.net.*;
public class Client {
	private DataInputStream dataInputStream;
	private DataOutputStream dataOutputStream;

	private Socket clientSocket;
	public void connect() {
		try
		{
			clientSocket = new Socket("125.177.95.108",10002);
			System.out.println("접속완료!!");
		}catch(Exception ex) {}
	
	}
	
	public String dataRecv()
	{
		try {
			return dataInputStream.readUTF();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		return null;
	}
	
	public void dataSend(String sendData)
	{
		try {
			dataOutputStream.writeUTF(sendData);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void streamSetting() {
		// 받아온 정보 입력
		try {
			dataInputStream = new DataInputStream(clientSocket.getInputStream());
			dataOutputStream = new DataOutputStream(clientSocket.getOutputStream());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
	}
	
	public Client()
	{
		connect(); // 접속을 함
		streamSetting(); // 스트림세팅
		dataSend("안녕하세요 클라이언트 입니다^^!!");
		System.out.println(dataRecv());
		
	}
	
	public static void main(String[] args) {
		new Client();
	}
}

   클라이언트에서는 서버의 ip주소를 받아와서 접속을하면 데이터를 받아올 수 있었다. 

 

 

728x90
반응형