gwooden_코린이

java_네트워크에 대해 본문

데이터베이스

java_네트워크에 대해

gwooden22 2022. 12. 12. 09:49
728x90

- 네트워크

서버와 클라이언트를 연결해주는 것

뭔가를 주고 받는 행위

 

클라이언스 / 서버

클라이언트 요청 -> 서버 -> 요청사항 처리 -> 서버 -> 클라이이언트에게 응답

 

 

OSI 7 계층 <-- 국제표준기구

  • 네트워크에 관련된 장비, 규약 -> 기존에는 회사마다 다 달랐다.
  • 이를 해결하기 위해 업체마다의 표준을 맞추려고 함

 

1계층 - 물리 계층

  • 기계, 전기, 기능을 케이블로 전송
  • 단순히 주고받기만 하는 계층
  • 장비 : 리피터, 허브

 

2계층 - 데이터 링크 계층

  • 정보의 전달
  • 오류 검출
  • 단위 : 프레임
  • 장비 : 브리지, 스위치

 

3계층 - 네트워크 계층(IP 계층이라고도 함)

  • 안정성 향상, 속도 상승
  • IP할당

 

4계층 - 전송 계층

  • 통신이 활성화되는 계층
  • TCP 프로토콜을 사용
    • 프로토콜 : 통신 규약
    • TCP : 상호간 신뢰적인 연결지향 서비스를 제공
    • 패킷 손실 가능성이 적다, 중복, 순서 변경되는경우가 없음
  • 비연결 -> UDP
    • 신뢰성이 낮음
    • 비연결성 1: 다수

 

5계층 - 세션 계층

  • 통신을 위한 논리적 연결
  • 대표적인 ex) 로그

 

6계층 - 표현 계층

 

 

7계층 - 응용 계층

  • 서비스 제공

ip / port

- ip

 

- port 번호

 

- socket

  • 연결해주는 장치

 

서버 동작 과정

  1. 소켓 생성
  2. ip, port를 지정
  3. 클라이언트 요청 대기
  4. 요청 ok -> 데이터 송수신 소켓 생성
  5. 송수신
  6. 연결 종료

 

클라이언트

  1. 소켓 생성
  2. 서버한테 요청 연결
    1. 서버 동장 과정에서 4번 항목과 연결
  3. 송수신
  4. 연결 종료

 

Java API에 모두 포함되어 있다


- 내컴퓨터 ip 주소 확인해보기

- 네이버 ip 주소 확인해보기

import java.net.InetAddress;

public class Main {

	public static void main(String[] args) {
		
		try {
		InetAddress local = InetAddress.getLocalHost(); //예외발생할 경우가 있을 수 있으므로 예외처리 필요
		System.out.println("내컴퓨터  ip 주소 : " + local.getHostAddress());
		
		InetAddress[] iaArr = InetAddress.getAllByName("www.naver.com");
		for(InetAddress r : iaArr) {
			System.out.println("네이버 ip 주소 : " + r.getHostAddress());
		}
		
		}catch (Exception e) {
			
		}
		

	}

}


URL

Http:// " IP : Port"

 

? <-- 쿼리스트

요청방식 : get, post

get : 일반 검색 관련, 용량제한, 보안약함

post : 로그인 관련

 


ServerSocket

ip

port 1 ~ 65550

 

Socket

 

네트워크에선 특수한 IP 주소로 127.0.0.1이라는 IP 주소가 있다. 한 번씩 봤을 법한 주소인데, 이는 루프백(loopback) 혹은 로컬호스트 주소(localhost)라고도 불린다. 네트워크 통신이란 인터넷 상에 존재하는 호스트와 서로 패킷을 주고 받는 것

 

- 서버 클래스

package 소켓연결;

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		
		ServerSocket serverSok = null;
		
		try {
			serverSok = new ServerSocket();
			serverSok.bind(new InetSocketAddress("localHost", 5001));
			
			while(true) { //계속 대기상태 -> 연결되면 상태 변함
			System.out.println("[연결 대기]");
			
			// 클라이언트 측에서 요청이 들어오면 요청을 받고 아래 출력문으로 넘어감
			// 요청완료 하면 다시 대기상태로 돌아감
			Socket socket = serverSok.accept();
			InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
			//형변환이 필요하다 -> (InetSocketAddress)
			System.out.println("[연결 수락] : " + isa.getHostName());
					
			}
		} catch (Exception e) {
			System.out.println("[연결 실패]");
		}
		
		if(!serverSok.isClosed()) {
			try {
				serverSok.close();
			} catch(Exception e) {
				
			}
		}

	}

}

 

- 클라이언트 클래스

package 소켓연결;

import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {

	public static void main(String[] args) {
		Socket socket = null;
		
		try {
			socket = new Socket();
			System.out.println("[연결 요청]");
			socket.connect(new InetSocketAddress("localhost", 5001));
			System.out.println("[연결 성공]");
		} catch(Exception e) {
			
		}
		
		if(!socket.isClosed())
			try {
				socket.close();
			} catch (Exception e) {
				
			}

	}

}

 


- 서버 클래스 추가 코드

import java.io.OutputStream;

public class Server {
            
            byte[] bytes = null;
            String message= null;
            
            InputStream is= socket.getInputStream();
            bytes = new byte[100];
            int readByteCount = is.read(bytes);
            message = new String(bytes,0,readByteCount,"utf-8"); 
            System.out.println("[데이터 받음]"+message);
            
            OutputStream os= socket.getOutputStream();
            message = "hi Client";
            bytes = message.getBytes("utf-8");
            os.write(bytes);
            os.flush();
            System.out.println("[데이터 전송함]");
            
            is.close();
            os.close();
            socket.close();

 

- 클라이언트 클래스 추가 코드

import java.io.OutputStream;

public class Client {
        
        byte[] bytes = null;
         String message = null;
         
         OutputStream os = socket.getOutputStream();
         message = "hi Server";
         bytes= message.getBytes("utf-8");
         os.write(bytes);
         os.flush();
         System.out.println("[데이터 전송함]");
     
         InputStream is= socket.getInputStream();
         bytes = new byte[100];
         int readByteCount = is.read(bytes);
         message = new String(bytes,0,readByteCount,"utf-8");
         System.out.println("[데이터 받음]"+message);
      
         os.close();
         is.close();


- 스레드를 이용한 서버/클라이언트

 

1. 서버 클래스

package 스레드;

import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerMain {

	public static void main(String[] args) throws Exception {
		
		
		ServerSocket serverSocket = new ServerSocket(5500);
		
		while(true) {
			Socket socket = serverSocket.accept();
			System.out.println("ip : " + socket.getInetAddress() + "와 연결 성공");
			
			
			//송수신 쓰레드
			
			ReceiveTread rt = new ReceiveTread(socket);
			SendThread st = new SendThread(socket);
			
			rt.start();
			st.start();
		}

	}

}
package 스레드;

import java.io.DataInputStream;
import java.net.Socket;

public class RThread extends Thread {
	
	private final Socket socket;

	public RThread(Socket socket) {
		this.socket = socket;
	}
	
	public void run() {
	String message;
	
		try {
			DataInputStream dis = new DataInputStream(socket.getInputStream());
			
			while(true) {
				message = dis.readUTF();
				
				System.out.println("상대방 : " + message);
			}
		} catch (Exception e) {
			
	
		}
	}
	

}
package 스레드;

import java.io.DataInputStream;
import java.net.Socket;

public class ReceiveTread extends Thread {
	
	private final Socket socket;

	public ReceiveTread(Socket socket) {
		this.socket = socket;
	}
	
	/**계속 받을 수 있게 해주는 run 스레드*/
	public void run() {
		try {
			//DataInputStream <-- 보조 스트림 (socket.getInputStream())
			DataInputStream tmpbuf = new DataInputStream(socket.getInputStream());
			String message; //문자를 받는 변수 선언
			
			while(true) { //문자를 받을때 마다 무한 반복
				message = tmpbuf.readUTF(); //문자를 읽어올때는 readUTF 사용
				System.out.println("상대방 : " + message);
			}
		} catch (Exception e) {
			
			System.out.println("[연결종료]");
		}
		
	}
	

}

 

2. 스레드 클라이언트 클래스

package 스레드;

import java.net.Socket;

public class SocketClientMain {

	public static void main(String[] args) {
		
		
		Socket socket = null;
		
		try {
			socket = new Socket("localhost", 5500);
			System.out.println("[연결 성공]");
		} catch (Exception e) {
			System.out.println("[연결실패]");
		}
		
		if(socket != null) {
			RThread rt = new RThread(socket);
			SThread st = new SThread(socket);
			
			rt.start();
			st.start();
			
		}

	}

}
package 스레드;

import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SThread extends Thread{
	
	private final Socket socket;
	Scanner sc = new Scanner(System.in);
	
	
	public SThread(Socket socket) {
		this.socket = socket;
	}
	
	public void run() {
		String message;
		
		try {
			DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
			
			while(true) {
				message = sc.nextLine();
				
				dos.writeUTF(message);
				dos.flush();
			}
			
		}catch (Exception e) {
			
		}
	
	}

}
package 스레드;


import java.io.DataOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class SendThread extends Thread{
	
	private final Socket socket;
	Scanner sc = new Scanner(System.in);
	
	public SendThread(Socket socket) {
		this.socket = socket;
	}
	
	
	public void run() {
		try {
			DataOutputStream sendWriter = new DataOutputStream(socket.getOutputStream());
			String message;
			
			while(true) {
				message = sc.nextLine();
				sendWriter.writeUTF(message);
				sendWriter.flush();
			}
		}catch (Exception e) {
		
		}
	}
	

}

728x90
Comments