본문 바로가기
Web & Mobile/JAVA

Lecture 35 - Java(14) URLEncode, Decode, JSON Library, socket, tcpserver, tcpclient

by Bennyziio 2023. 6. 20.
반응형

URLEncodeEx01 - Encoding, Decoding

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class URLEncodeEx01 {

	public static void main(String[] args) {
		//String original = "[Java Solution : 홍길동]";
		String original = "홍길동";
		
		String encodeStr;
		String decodeStr;
		try {
			encodeStr = URLEncoder.encode(original, "utf-8");
			decodeStr = URLDecoder.decode(encodeStr, "utf-8");
			
			System.out.println(encodeStr);
			System.out.println(decodeStr);
			
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
}

java나 html이나 인코딩, 디코딩 되는 데이터 값은 같다

JSON library 추가 법

JSONEx01

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSONEx01 {

	public static void main(String[] args) {
		
		// json 문법 맞는 문자열
		// [] : 배열
		// {} : 객체
		// { "data1" : "value1" } : 멤버변수
		// www.jsonlint.com
		// json을 이용하여 배열을 표현
		//String json = "[8, 9, 6, 2, 9]";
		//String json = "[\"8\", \"9\", \"6\", \"2\", \"9\"]";
		String json = "[{ \"name\" : \"홍길동\", \"city\" : \"서울\"}]";
		
		JSONParser parser = new JSONParser();		
		
		try {
			JSONArray array = (JSONArray)parser.parse(json);
			System.out.println(array.size());
			
			for(int i=0; i<array.size(); i++) {
				//long data = (long)array.get(i);
				//String data = (String)array.get(i);
				//Object data = (Object)array.get(i); 
				//System.out.println(data);
				
				JSONObject object = (JSONObject)array.get(i);
				System.out.println(object.toString());
							
				String name = (String)object.get("name");
				String city = (String)object.get("city");
				System.out.println(name);
				System.out.println(city);	
			}

		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

String json = "[{ \"name\" : \"홍길동\", \"city\" : \"서울\"}]";
배열 안에 객체가 있는 데이터라서
JSONParser parser = new JSONParser();  파싱 인스턴스를 생성하고
트라이 캐치 안에서
JSONArray array = (JSONArray)parser.parse(json); 으로 배열을 파싱시키고
for문안에서
JSONObject object = (JSONObject)array.get(i); 배열 값을 읽어오게 시킨다
배열안에 원하는 데이터 즉, name이나 city는 
String name = (String)object.get("name"); 
String city = (String)object.get("city"); 와 같이 작성하여 get을 통해서 해당하는 객체의 값을 검색하고 값을 불러오는 작업을 한다

JSONEx02

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSONEx02 {

	public static void main(String[] args) {
		
		// json 문법 맞는 문자열
		// [] : 배열
		// {} : 객체
		// { "data1" : "value1" } : 멤버변수
		// www.jsonlint.com
		// json을 이용하여 배열을 표현
		//String json = "[8, 9, 6, 2, 9]";
		//String json = "[\"8\", \"9\", \"6\", \"2\", \"9\"]";
		//String json = "[{ \"name\" : \"홍길동\", \"city\" : \"서울\"}]";
		String json = "{ \"data\" : [8, 9, 6, 2, 9]}";
		
		JSONParser parser = new JSONParser();		
		
		try {
			JSONObject object = (JSONObject)parser.parse(json);
			System.out.println(object.toString());
			
			JSONArray array = (JSONArray)object.get("data");
			for(int i=0; i<array.size(); i++) {
				long data = (long)array.get(i);
				System.out.println(data);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

객체 안에 배열이 있는 데이터를 읽는 방법으로
String json = "{ \"data\" : [8, 9, 6, 2, 9]}";와 같은 데이터가 있다
앞에서 한것 과 같이 
JSONParser parser = new JSONParser();  파싱 인스턴스를 생성하고
트라이 캐치 블록안에서
JSONObject object = (JSONObject)parser.parse(json); 객체 파싱 구문을 수행하고
JSONArray array = (JSONArray)object.get("data"); 으로 배열안 데이터를 get으로 받아온다
array는 long타입으로 for문안에서 각 배열마다(i) 값을 읽어온다.

URLEx03

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

public class URLEx03 {

	public static void main(String[] args) {
		BufferedReader br = null;
		Scanner scan = new Scanner(System.in);
		String input = "";
		try {
			System.out.print("찾고자 하는 지명을 입력하세요 : ");
			input = scan.nextLine();
			URL url = new URL("https://maps.googleapis.com/maps/api/geocode/json?address=" + input);
			br = new BufferedReader(new InputStreamReader(url.openStream()));
					
			String data = "";
			while((data = br.readLine()) != null) {
				if (data.contains("\"location\" : ")) {
					System.out.println(br.readLine());
					System.out.println(br.readLine());
				}
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {};
		}
	}
}

URLEx04

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;

public class URLEx04 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.print("역이름 입력 : ");
		String strStation = scan.nextLine();
		
		scan.close();
		BufferedReader br = null;
		
		try {
			String encodeStation = URLEncoder.encode(strStation,  "utf-8");
			URL url = new URL("https://maps.googleapis.com/maps/api/geocode/json?address=" + encodeStation);
			br = new BufferedReader(new InputStreamReader(url.openStream()));
					
			String data = "";
			while((data = br.readLine()) != null) {
				if(data.contains("\"location\"")) {
					//String latitude = br.readLine().trim();
					//String longitude = br.readLine().trim();
					
					//String latitude = br.readLine().trim().replace("lat\" : ", "");
					//String longitude = br.readLine().trim().replace("lng\" : ", "");
					
					String latitude = br.readLine().trim().substring(8).replace(",", "");
					String longitude = br.readLine().trim().substring(8);
					
					//System.out.println(latitude.substring(8).replaceAll(",", ""));
					//System.out.println(longitude.substring(8));
									
					System.out.println("위도 : " + latitude);
					System.out.println("경도 : " + longitude);
				}
			}
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {};
		}
	}
}

JSONEx03

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Scanner;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSONEx03 {
    public static void main(String[] args) {
      Scanner scan = new Scanner(System.in);

      BufferedReader br = null;
      
      try {
      	end :
      	while(true) {
      		
      		System.out.println("");
              System.out.print("검색하고자 하는 장소를 입력하세요 (q를 입력하면 종료합니다) : ");
              String msg = scan.nextLine();
              String encodemsg = URLEncoder.encode(msg, "utf-8");
              if(msg.equals("q")) {
              	System.out.println("프로그램을 종료합니다.");
              	System.exit(0);
              }
              

      		URL url = new URL("https://maps.googleapis.com/maps/api/geocode/json?address=" + encodemsg);
      		
              	br = new BufferedReader(new InputStreamReader(url.openStream())); 
              
              	/*String data = "";
              	StringBuffer sbData = new StringBuffer();
              	while((data = br.readLine()) != null) {
            	  sbData.append(data);
              	}*/
              
              	JSONParser parser = new JSONParser();
              
              	//JSONObject results = (JSONObject)parser.parse(sbData.toString());
              	// bufferedreader 에서 불러온 URL을 바로 불러들릴수 있다. 네트워크에서 데이터를 받아오기 때문에 따로 데이터를 저장할 필요가 없다.
              	JSONObject results = (JSONObject)parser.parse(br);
              	JSONArray arrResults = (JSONArray)results.get("results");
              	// get(0)은 전체 데이터를 불러들이는 과정이다. 순서는 상관없음 - hash map이기 때문
              	JSONObject arrResult = (JSONObject)arrResults.get(0);
              	JSONObject geometry = (JSONObject)arrResult.get("geometry");
              	JSONObject location = (JSONObject)geometry.get("location");
			  
              	double latitude = (Double)location.get("lat");
              	double longitude = (Double)location.get("lng");
			  
              	System.out.println(latitude);
              	System.out.println(longitude);
              	
              	String option
              		= String.format("https://www.google.com/maps/@%s,%s,18z/", latitude, longitude);
              	ProcessBuilder processbuilder
              		= new ProcessBuilder("C:\\Program Files\\Internet Explorer\\iexplore.exe", option);
              	processbuilder.start();
      	}
            
      } catch (MalformedURLException e) {
            e.printStackTrace();
      }catch (ParseException e) {
			e.printStackTrace();
      } catch (IndexOutOfBoundsException e) {
      	e.printStackTrace();
          //System.out.println(e.getMessage());
          //System.out.println("API KEY가 필요합니다.다시 실행해 주시길 바랍니다.");
      } catch (IOException e) {
            e.printStackTrace();
      } finally {
            if(br != null) try {br.close();} catch(IOException e) {};
      }
      scan.close();
    }
}

URLConnection
URLConnection은 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상클래스이다. URLConnection을 상속받아 구현한 클래스로는 HttpURLConnection과 JarURLConnection이 있으며 URL의 프로토콜이 http프로토콜이라면 openConnection()은 Http URLConnection을 반환한다. URLConnection을 사용해서 연결하고자하는 자원에 접근하고 읽고 쓰기를 할 수 있다.

NextworkEx3

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class NextworkEx3 {

	public static void main(String[] args) {
		URL url = null;
		String address = "http://www.naver.com/index.html";
		
		try {
			url = new URL(address);
			URLConnection conn = url.openConnection();
			
			System.out.println("conn.toString() :" + conn);
			System.out.println("getAllowUserInteraction() : " + conn.getAllowUserInteraction());
			System.out.println("getConnectTimeout() : " + conn.getConnectTimeout());
			System.out.println("getContent() : " + conn.getContent());
			System.out.println("getContentEncoding() : " + conn.getContentEncoding());
			System.out.println("getContentLength() : " + conn.getContentLength());
			System.out.println("getContentType() : " + conn.getContentType());
			System.out.println("getDate() : " + conn.getDate());
			System.out.println("getDefaultAllowUserInteraction() : " + conn.getDefaultAllowUserInteraction());
			System.out.println("getDefaultUseCaches() : " + conn.getDefaultUseCaches());
			System.out.println("getDoInput() : " + conn.getDoInput());		// inputstream
			System.out.println("getDoOutput() : " + conn.getDoOutput());	// outputstream
			System.out.println("getExpiration() : " + conn.getExpiration());
			System.out.println("getHeaderFields() : " + conn.getHeaderFields());
			System.out.println("getIfModifiedSince() : " + conn.getIfModifiedSince());
			System.out.println("getLastModified() : " + conn.getLastModified());
			System.out.println("getReadTimeout() : " + conn.getReadTimeout());
			System.out.println("getURL() : " + conn.getURL());
			System.out.println("getUseCaches() : " + conn.getUseCaches());
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

URLConnectionEx02

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLConnectionEx02 {

	public static void main(String[] args) {
		URL url = null;
		
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		
		try {
			url = new URL("https://t1.daumcdn.net/b2/creative/43386/6a06922f1fa86d15d8d9ad238c1f54bf.jpg");
			URLConnection conn = url.openConnection();
			
			bis = new BufferedInputStream(conn.getInputStream());
			bos = new BufferedOutputStream(new FileOutputStream("c:/Java/daum.jpg"));
			
			int data = 0;
			while((data = bis.read()) != -1) {
				bos.write(data);
			}
			
			System.out.println("전송이 완료되었습니다.");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bis != null) try {bis.close();} catch(IOException e) {};
			if(bos != null) try {bos.close();} catch(IOException e) {};
		}
	}
}

위와 같은 프로그램을 코딩하였다고 볼 수 있다.

소켓 프로그래밍
소켓 프로그래밍은 소켓을 이용한 통신 프로그래밍을 뜻하는데, 소켓(socket)이란 프로세스간의 통신에 사용되는 양쪽 끝단(endpoint)을 의미한다. 서로 멀리 떨어진 두 사람이 통신하기 위해서 전화기가 필요한 것처럼, 프로세스간의 통신을 위해서는 그 무언가가 필요하고 그것이 바로 소켓이다.
자바에서는 java.net패키지를 통해 소켓 프로그래밍을 지원하는데, 소켓통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다.

TCP와 UDP
TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다. TCP와 UDP 모두 TCP/IP 프로토콜(TCP/IP protocol suites)에 포함되어 있으며, OSI 7계층의 전송계층(transport layer)에 해당하는 프로토콜이다.
TCP와 UDP는 전송 방식이 다르며, 각 방식에 따른 장단점이 있다.
TCP : 연결기반(연결후 통신 - 전화기, 1:1 통신방식), 데이터의 경계를 구분 안함, 신뢰성있는 데이터 전송(전송순서 보장, 데이터 수신여부 확인, 패킷 관리할 필요 없음), UDP보다 전송 속도 느림
UDP : 비연결기반(연결없이 통신 - 방송, 1:n 통신), 데이터의 경계를 구분, 신뢰성 없음(전송순서 바뀜, 데이터 수신여부 확인안함, 패킷을 관리함), TCP보다 전송속도 빠름

TCP소켓 프로그래밍
TCP소켓 프로그래밍은 클라이언트와 서버간의 일대일 통신이다.
먼저 서버 프로그램이 실행되어 클라이언트 프로그램의 연결요청을 기다리고 있어야한다. 서버 프로그램과 클라이언트 프로그램간의 통신과정을 단계별로 보면 다음과 같다.
1. 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다.
2. 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다.
3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.
4. 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다.

SocketEx01.Socket1
TCPServerEx01

package Socket1;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedWriter bw = null;
		
		try {
			// 개방될 포트 : 7777
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			// 개방 - 클라이언트 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트에 연결되었습니다");
			
			// socket을 통해서 outputstream을 만든다
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			bw.write("안녕 한글" + "\n");
			System.out.println("클라이언트에 전송 완료");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

TCPClientEx01

package Socket1;

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

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

TCPServerEx01 - 클라이언트에 전송해보기

package Socket1;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedWriter bw = null;
		
		try {
			// 개방될 포트 : 7777
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			// 클라이언트 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트에 연결되었습니다");
			
			// socket을 통해서 outputstream을 만든다
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			bw.write("Hello Client" + "\n");
			System.out.println("클라이언트에 전송 완료");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

TCPClientEx01 - 서버로 부터 데이터 수신

package Socket1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
			
			// 서버에서 던져준것을 받는다
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("메세지 : " + br.readLine());
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

한글 깨지는 경우

TCPServerEx01 - 한글 보내는 법 "utf-8"을 추가한다

package Socket1;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedWriter bw = null;
		
		try {
			// 개방될 포트 : 7777
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			// 클라이언트 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트에 연결되었습니다");
			
			// socket을 통해서 outputstream을 만든다
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			bw.write("안녕 한글" + "\n");
			System.out.println("클라이언트에 전송 완료");
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

TCPClientEx01 - 한글 받는 법 "utf-8"을 추가한다

package Socket1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
			
			// 서버에서 던져준것을 받는다
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			System.out.println("메세지 : " + br.readLine());
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

Socket2.TCPServerEx01 - 클라이언트로 부터 데이터 받기

package Socket2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		//BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
			/*
			// 서버에서 던져준것을 받는다
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			System.out.println("메세지 : " + br.readLine());
			*/
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			bw.write("서버는 들으시오");
			System.out.println("서버로 발신 완료");
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//if(br != null) try {br.close();} catch(IOException e) {};
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

Socket2.TCPClientEx01 - 서버로 데이터 보내기

package Socket2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		//BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
			/*
			// 서버에서 던져준것을 받는다
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			System.out.println("메세지 : " + br.readLine());
			*/
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			bw.write("서버는 들으시오" + "\n");
			System.out.println("서버로 발신 완료");
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//if(br != null) try {br.close();} catch(IOException e) {};
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

위와 같이 클라이언트로부터 데이터를 받을 수 있다.

Socket3.TCPServerEx01 - 클라이언트로부터 받은 데이터를 다시 클라이언트에 보내기 (echo server)

package Socket3;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		
		try {
			// 개방될 포트 : 7777
			serverSocket = new ServerSocket(7777);
			System.out.println("서버가 준비되었습니다.");
			
			// 클라이언트 대기
			socket = serverSocket.accept();
			System.out.println("클라이언트에 연결되었습니다");
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));

			// echo 서버 구현
			String msg = br.readLine();
			bw.write(msg + "\n");
			// 나 출력 다했음
			bw.flush();
			
			System.out.println("전송 완료");
			
			
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(br != null) try {br.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

Socket3.TCPClientEx01 - 클라이언트로 부터 받은 데이터를 클라이언트에 다시 보내기(echo server)

package Socket3;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;
		BufferedReader br = null;
		BufferedWriter bw = null;
		
		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");
		
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
			br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
			
			bw.write("Hello Server, Are you there?" + "\n");
			// 출력 다 했음
			bw.flush();
			System.out.println("서버로 발신 완료");
			
			String msg = br.readLine();
			System.out.println("메세지 : " + msg);
			
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(br != null) try {br.close();} catch(IOException e) {};
			if(bw != null) try {bw.close();} catch(IOException e) {};
			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

서버는 자고로 데이터를 보내고 받는 것을 또 기다리고 받으면 보내고 또 받을거 기다리고 무한 loop상태여야 한다

Socket4.TCPServerEx01 - 대기 서버 형태

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

public class TCPServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		
		try {
			
			serverSocket = new ServerSocket(7777);		// 개방될 포트 : 7777
			
			// socket이 만들어지고 지워지고 만들어지고 지워지고 계속 해야 대기형 서버이다
			while(true) {
				try {
					System.out.println("서버가 준비되었습니다.");
					socket = serverSocket.accept();				// 클라이언트 대기
					System.out.println("클라이언트에 연결되었습니다" + socket.getInetAddress());
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					if(socket != null) try {socket.close();} catch(IOException e) {};
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

Socket4.TCPClientEx01

package Socket4;

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

public class TCPClientEx01 {

	public static void main(String[] args) {
		Socket socket = null;

		try {
			System.out.println("서버와 연결 중입니다.");
			// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트
			socket = new Socket("localhost", 7777);
			System.out.println("서버와 연결되었습니다");

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {

			if(socket != null) try {socket.close();} catch(IOException e) {};
		}
	}
}

서버의 아이피가 뜬다

socket = new Socket("192.168.0.11", 7777);

위와 같이 작성하면 상대방 서버가 대기상태일때 접속할 수 있게 된다.
반대로 누가 나의 서버로 들어오면 아래와 같이 접속 아이피를 출력시켜 확인할 수 있다.

구구단 클라이언트 / 구구단 서버
클라이언트가 7단을 보내면 서버에서 7 x 1 = 7 ... 7 x 9 = 63을 클라이언트로 보내고
클라이언트는 이것을 받아서 다시 출력

gugudanServerEx01

package gugudan;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class gugudanServerEx01 {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;

		BufferedWriter bw = null;
		BufferedReader br = null;
		
		String dan = "";
		int dan2 = 0;
		
		try {
			serverSocket = new ServerSocket(7777);		// 개방될 포트 : 7777

			// socket이 만들어지고 지워지고 만들어지고 지워지고 계속 해야 대기형 서버이다
			while(true) {
				try {
					System.out.println("서버가 준비되었습니다.");
					socket = serverSocket.accept();				// 클라이언트 대기
					System.out.println("클라이언트에 연결되었습니다" + socket.getInetAddress());
					br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
					bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));

					dan = br.readLine();
					
					if(dan.equals("q")) {
						System.out.println("시스템을 종료합니다" + "\n");
						System.exit(0);
					} else {
						dan2 = Integer.parseInt(dan);
						for(int j=1; j<=9; j++) {
							System.out.print(dan2 + "x" + j + "=" + dan2*j + "\n");
							bw.flush();
						}
						bw.write(dan2 + "\n");
						bw.flush();
					}
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					if(bw != null) try {bw.close();} catch(IOException e) {};
					if(br != null) try {br.close();} catch(IOException e) {};
					if(socket != null) try {socket.close();} catch(IOException e) {};
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if(serverSocket != null) try {serverSocket.close();} catch(IOException e) {};
		}
	}
}

gugudanClientEx01

package gugudan;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class gugudanClientEx01 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int dan = 0;
		Socket socket = null;
		
		BufferedWriter bw = null;
		BufferedReader br = null;
		
		while(true) {
			try {
				System.out.print("단수 입력 : " + "\n");
				String input = scan.nextLine();
				socket = new Socket("localhost", 7777);
				System.out.println("서버와 연결되었습니다");
				bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
				br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
				
				if(input.equals("q")) {
					System.out.println("종료" + "\n");
					bw.write(input + "\n");
					bw.flush();
					break;
				} else {
					System.out.println("입력 메시지 : " + input);
					System.out.println("서버와 연결 중입니다.");
					// 어느 IP(도메인)의 몇 번 포트에 가서 붙어라~~여기선 localhost에 7777번 포트

					bw.write(input + "\n");
					bw.flush();

					dan = Integer.parseInt(br.readLine());
					
					for(int j=1; j<=9; j++) {
						System.out.print(dan + "x" + j + "=" + dan*j + "\n");
						bw.flush();
					}
				}
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if(br != null) try {br.close();} catch(IOException e) {};
				if(bw != null) try {bw.close();} catch(IOException e) {};
				if(socket != null) try {socket.close();} catch(IOException e) {};
			}
		}
	}
}

 

 

반응형

댓글