19-Network



네트워크


서버와 클라이언트

network: 여러 대의 컴퓨터를 통신 회선으로 연결한 것

  • 서버: 클라이언트의 요청을 처리하고 결과를 리턴하는 컴퓨터
  • 클라이언트: 요청하는 컴퓨터 (ip, port가 있어야 함)

한 개의 서버에 여러 클라이언트가 요청하는 시스템

자바의 웹은 이러한 처리를 하기 위해 멀티스레드가 이미 구현된 상태로 제공되고 있다.


  • 프로토콜(protocol) : A라는 컴퓨터랑 B라는 컴퓨터가 소통을 하려면 일종의 약속된 규칙이 있어야 한다. 그것이 바로 프로토콜
    • 서버와 클라이언트에는 동일한 프로토콜을 사용할 수 있는 환경이 되어야 한다.



java.net

통신구현

​ tcp통신 방식과, udp 통신 방식으로 구분 (tcp프로토콜, udp 프로토콜)

  • java.net.ServerSocket
  • java.net.Socket
tcp통신 구현 (전화) udp통신 구현 (이메일)
java.net.SercerSocket
java.net.Socket

1. 연결
2. 서버- 출력-클라이언트 입력
3. 클라이언트 출력 - 서버입력
4. 연결해제
java.net.DatagramSocket
java.net.DatagramPacket

1. 보낸 이메일 + 받는 이메일 + 내용
2. 보낸 이메일 + 받는 이메일 + 내용2
…..
연결 해제라는 개념이 없음.
동시에 대량 내용 전송이 가능, 응답 필요가 없는 메시지
http - 웹클라이언트/서버  


tcp통신

tcp server class tcp client class
1. ServerSocket 생성
(서버마다의 식별자인 port 필요)
3. tcp 연결 클라이언트 대기- 승인- Socket리턴
5. 클라이언트로부터 데이터 전송받음 = 서버 입력
6. 요청 내용 처리, 그 결과를 전송 = 서버 출력
9. Socket close = 연결 해제
10. 또 다른 클라이언트 연결 요청, 대기, 승인
2. Socket 생성
(“tcp server 컴퓨터 ip”, port 값)
4. 서버로 데이터 전송 = 클라이언트 출력
7. 서버로부터 데이터를 전송 받음 = 클라이언트 입력
… 필요한 만큼 작업 반복 …
8. Socket close = 서버와의 연결 해제
  • 양 쪽에 Socket이 생성되면 연결된 것.
  • 서버는 ServerSocket과 Socket 두 개가 있어야 하고 클라이언트는 Socket만 있으면 된다.


구현1) 서버 연결 과정

package server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

	public static void main(String[] args) {
		//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
		//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것 
		// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것 
		try{
		ServerSocket ss = new ServerSocket(9999); // 서버 시작, 연결 대기 중 
		System.out.println("----서버 시작 대기 중----");
		Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점 
		System.out.println("----클라이언트와 연결 중----");
		s.close();
		System.out.println("----클라이언트와 연결 종료----");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

구현2) 언어 통신하기 입출력(server)

ackage server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

	public static void main(String[] args) {
		//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
		//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것 
		// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것 
		try{
		ServerSocket ss = new ServerSocket(8999); // 서버 시작, 연결 대기 중 
		System.out.println("----서버 시작 대기 중----");
		while(true) {
			Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점 
			System.out.println("----클라이언트와 연결 중----");
			InputStream i = s.getInputStream();
			//o.write(byte[])
			byte b[] = new byte[100];
			
			i.read(b); // read한 것을 byte b에 넣어
			//byte[] -> String 
			String input_b = new String(b);
			System.out.println("----클라이언트가 서버로 전송한 데이터 = " +input_b);
			
			//클라리언트로 hello client 문자열 전송 = 서버 출력
			OutputStream o = s.getOutputStream();
			String data = "hello client";
			//String --> byte[] 변경 
			//byte[] - > String 
			byte[] data_byte = data.getBytes();
			o.write(data_byte);
			
			
			s.close();
			System.out.println("----클라이언트와 연결 종료----");
		}
		
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

구현2) 언어 통신하기 입출력(client)

package client;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {

	public static void main(String[] args) {
	
	try {	
		Socket s = new Socket("192.168.0.41",8999);
		System.out.println("----서버와의 연결 중----");
		
		//클라이언트가 서버로 출력  
		OutputStream o = s.getOutputStream();
		String data = "hello server";
		
		byte[] data_byte = data.getBytes();
		o.write(data_byte);
		
		
		//클라이언트가 서버로부터 입력받는 방법 1. 
		InputStream i = s.getInputStream();

	/*	byte b[] = new byte[100];
		i.read(b); // read한 것을 byte b에 넣어
		String input_b = new String(b);
	*/	
		//방법 2.
	    Scanner sc = new Scanner(i);
	    String input_b = sc.nextLine(); // 전체 메시지 입력 받는 것 가
		System.out.println("----서버가 클라이언트로 전송한 데이터 = " +input_b);
		
		//방법 3. 
		
		
		
		s.close();
		System.out.println("----서버와의 연결 종료----");
	}catch(Exception e) {
		e.printStackTrace();
	   }
	
	}

}



java.io.DataInputStream
–>DataOutputStream 출력된 데이터를 입력받는 객체
= java.util.Scanner 동일
java.io.DataOutputStrema
–>출력시 자바 데이터타입 변환
 
출력시 데이터타입으로 되었으면, 인풋도 데이터타입으로
즉, 스캐너 사용 안 됨, 둘은 일종의 쌍. 반드시 같은 타입으로
``

다음은 앞의 입출력을 DataInput Output Stream으로 바꾼 것이다.


TCPserver

package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer_Data {

	public static void main(String[] args) {
		//ServerSocket 생성 port 번호 = 서버 프로그램 식별 번호 = 2^16 = 0-65535
		//0-1024 이내 windows ftp telnet http 프로토콜 포트 예약, 피할 것 
		// 1025 - 5000 이내 권고사항, os 사용소지가 크니 피할 것 
		try{
		ServerSocket ss = new ServerSocket(8999); // 서버 시작, 연결 대기 중 
		System.out.println("----서버 시작 대기 중----");
		while(true) {
			Socket s = ss.accept(); //연결 승인, 결과물로 Socket생성 - 연결점 
			System.out.println("----클라이언트와 연결 중----");
			InputStream i = s.getInputStream();
			DataInputStream ds = new DataInputStream(i);
			String input_b = ds.readUTF();
			
			System.out.println("----클라이언트가 서버로 전송한 데이터 = " +input_b);
			
			//클라리언트로 hello client 문자열 전송 = 서버 출력
			OutputStream o = s.getOutputStream();
			DataOutputStream ds2 = new DataOutputStream(o);
			String data = "hello client";
			ds2.writeUTF(data);
			
			
			s.close();
			System.out.println("----클라이언트와 연결 종료----");
		}
		
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

TCPclient

package client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient_Data {

	public static void main(String[] args) {
	
	try {	
		Socket s = new Socket("192.168.0.41",8999);
		System.out.println("----서버와의 연결 중----");
		
		//클라이언트가 서버로 출력  	
		OutputStream o = s.getOutputStream();
		//o.write(byte1개/byte[])
		DataOutputStream ds = new DataOutputStream(o);
		String data = "hello server";
		ds.writeUTF(data);
		
		
		//클라이언트가 서버로부터 입력받는 방법 1. 
		InputStream i = s.getInputStream();

	    DataInputStream ds2 = new DataInputStream(i);
	    String input_b = ds2.readUTF();
		System.out.println("----서버가 클라이언트로 전송한 데이터 = " +input_b);
		
		//방법 3. 
		
		
		
		s.close();
		System.out.println("----서버와의 연결 종료----");
	}catch(Exception e) {
		e.printStackTrace();
	   }
	
	}

}


** DataInput과 Output은 쌍이다. 같이 써줘야 함.

서버 클라이언트
1.클라이언트로부터 아이디, 암호 전송 받음
2.String ids [] = {“java”, “jsp”, “spring”};
클라이언트로부터 아이디는 중복체크
3. 클라이언트에게 전송.
중복된 아이디라면 “다른 아이디를 사용하세요
중복되지 않았다면”xxxx는 사용 가능합니다.”
1.회원아이디 입력: xxxx
2.암호 입력: xxx
3.서버로 전송