IT/JAVA (17.12.18~)

22일 JAVA(22)

만두토끼 2018. 1. 24. 12:52

1 텍스트 파일의 내용을 읽어서 데이터 분석하기

1) 프로젝트 생성

2) 프로젝트에 텍스트 파일을 복사 - log.txt

3) 파일의 내용 읽기


package analysis;


import java.io.BufferedReader;

import java.io.FileReader;


public class Main1 {


public static void main(String[] args) {

//log.txt 파일의 내용을 읽을 수 있는 객체를 생성

//log.txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

//BufferedReader를 사용하는 것이 좋습니다.

try(BufferedReader br = 

new BufferedReader(

new FileReader("log.txt"))){

//try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.

//텍스트 파일의 내용을 전부 읽어서 출력하기

//BufferedReader 객체에는 readLine()이라는 메소드가 있는데

//줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

//마지막 줄에 가서 더이상 데이터를 읽지 못하면 null을 리턴

while(true) {

String content = br.readLine();

if(content == null) {

break;

}

System.out.println(content);

}

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}


}

}





4) log 파일 내용

=>공백을 기준으로 첫번째 내용은 접속한 컴퓨터의 IP 입니다.

=>열번째 내용은 컴퓨터가 사용한 traffic 입니다.

package analysis;


import java.io.BufferedReader;

import java.io.FileReader;


public class Main2 {

public static void main(String[] args) {

//log.txt 파일의 내용을 읽을 수 있는 객체를 생성

//log.txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

//BufferedReader를 사용하는 것이 좋습니다.

try(BufferedReader br = 

new BufferedReader(

new FileReader("log.txt"))){

//try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.

//텍스트 파일의 내용을 전부 읽어서 출력하기

//BufferedReader 객체에는 readLine()이라는 메소드가 있는데

//줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

//마지막 줄에 가서 더이상 데이터를 읽지 못하면 null을 리턴

while(true) {

String content = br.readLine();

if(content == null) {

break;

}

//content 중에 공백을 기준으로 맨 앞의 데이터(IP)만 출력

//특정한 문자나 문자열을 기준으로 분할해주는 메소드 

//split(구분자) - String []로 리턴합니다.

String [] ar = content.split(" ");

System.out.println(ar[0]);

}

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}

}

}




5) 중복된 IP를 제거하고 트래픽 합계 구하기

package analysis;


import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashSet;


public class Main3 {

public static void main(String[] args) {

//log.txt 파일의 내용을 읽을 수 있는 객체를 생성

//log.txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

//BufferedReader를 사용하는 것이 좋습니다.

try(BufferedReader br = 

new BufferedReader(

new FileReader("log.txt"))){

//try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.

//텍스트 파일의 내용을 전부 읽어서 출력하기

//BufferedReader 객체에는 readLine()이라는 메소드가 있는데

//줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

//마지막 줄에 가서 더이상 데이터를 읽지 못하면 null을 리턴

//중복된 데이터를 제거하기 위한 Set 객체를 생성

HashSet<String> set = new HashSet<String>();

//트래픽의 합계를 저장하기 위한 변수

int sum = 0;

while(true) {

String content = br.readLine();

if(content == null) {

break;

}

//content 중에 공백을 기준으로 맨 앞의 데이터(IP)만 출력

//특정한 문자나 문자열을 기준으로 분할해주는 메소드 

//split(구분자) - String []로 리턴합니다.

String [] ar = content.split(" ");

//ar[0]를 set에 추가

set.add(ar[0]);

//합계 구하기

sum = sum + Integer.parseInt(ar[9]);

}

//중복된 IP 없이 출력

for(String temp : set) {

System.out.println(temp);

}

System.out.println("=========================");

//트래픽의 합계 출력

System.out.println("트래픽 합계:" + sum);

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}

}

}




6) IP 별 Traffic의 합을 구하기


- Map

=>Key 와 Value를 동시에 저장

=>중복된 Key는 저장될 수 없어서 동일한 Key에 데이터를 삽입하면 수정이 발생합니다.


package analysis;


import java.io.BufferedReader;

import java.io.FileReader;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Set;


public class Main4 {

public static void main(String[] args) {

// log.txt 파일의 내용을 읽을 수 있는 객체를 생성

// log.txt 파일은 문자열로 구성된 파일이므로 읽기 위한 클래스는

// BufferedReader를 사용하는 것이 좋습니다.

try (BufferedReader br = new BufferedReader(new FileReader("log.txt"))) {

// try()안에 객체를 생성하면 close()를 하지 않아도 됩니다.


// 텍스트 파일의 내용을 전부 읽어서 출력하기

// BufferedReader 객체에는 readLine()이라는 메소드가 있는데

// 줄 단위로 데이터를 읽고 읽은 내용을 String으로 리턴합니다.

// 마지막 줄에 가서 더이상 데이터를 읽지 못하면 null을 리턴


//IP 별 트래픽 합계

HashMap <String, Object>map = 

new HashMap<String, Object>();

while (true) {

String content = br.readLine();

if (content == null) {

break;

}

// content 중에 공백을 기준으로 맨 앞의 데이터(IP)만 출력

// 특정한 문자나 문자열을 기준으로 분할해주는 메소드

// split(구분자) - String []로 리턴합니다.

String[] ar = content.split(" ");

//IP를 가져와서 temp에 저장

Object temp = map.get(ar[0]);

//ip의 존재여부를 가지고 없으면 ip와 traffice을 저장

//ip를 키로 하고 traffic을 데이터로 저장

if(temp == null) {

map.put(ar[0], Integer.parseInt(ar[9]));

}

//이미 존재하는 IP라면 traffic에 추가해서 저장

else {

int value = (Integer)map.get(ar[0]);

value = value + Integer.parseInt(ar[9]);

map.put(ar[0], value);

}

}

//map의 모든 데이터 출력

Set<String>keys = map.keySet();

for(String key : keys) {

System.out.println(key + ":" + map.get(key));

}

} catch (Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}

}

}





2. 네트워크 명령어

1) ipconfig(ifconfig)

=>자기 컴퓨터의 ip 주소 정보를 확인하는 명령


2) ping ip주소 또는 도메인

=>상대방과 소켓 통신이 가능한지 여부를 확인하는 명령


30 netstat -ano

=>현재 컴퓨터에서 사용 중인 포트를 확인하는 명령




3. InetAddress - java.net

=>인터넷 주소 정보를 저장하는 클래스

=>생성자를 이용하지 않고 static 메소드를 호출해서 객체를 생성


InetAddress static getLocalHost(): 자기 컴퓨터에 대한 주소 정보 생성

InetAddress static getByName(도메인): 도메인에 해당하는 컴퓨터 1대의 주소 정보 생성

InetAddress [] static getAllByName(도메인): 도메인에 해당하는 컴퓨터 의 모든 주소 정보를 배열로 생성




4. Socket

=>네트워크 어댑터를 프로그래밍에서 사용하기 위해 추상화 한 클래스


1) Socket 클래스

=>다른 컴퓨터와 연결하기 위한 클래스


- 생성자

Socket(): 일반 소켓을 만들 때 사용하는 생성자

Socket(InetAddress addr, int port): addr 주소의 port에 접속하기 위한 소켓을 생성

Socket(String addr, int port): addr 주소의 port에 접속하기 위한 소켓을 생성 - 주소를 문자열로 대입

Socket(InetAddress addr, int port, InetAddress localAddr, int localPort): addr 주소의 port에 접속하기 위한 소켓을 생성하는데 자신의 주소를 localAddr 의  localPort로 설정해서 연결


- 메소드

void close(): 소켓 닫기

InputStream getInputStream(): 상대방으로 데이터를 읽어오기 위한 스트림을 만들어주는 메소드

OutputStream getOutputStream(): 상대방에게 데이터를 보내기 위한 스크림을 만들어주는 메소드

InetAddress getInetAddress(): 연결된 상대방의 주소 정보를 리턴하는 메소드

int getPort(): 연결된 상대방의 포트 정보를 리턴하는 메소드



=>192.168.0.200 이고 port 번호가 30000번을 개방함

Hello 메시지를 저 컴퓨터에게 전송

Socket socket = new Socket('192.168.0.200', 30000);

PrintWriter pw = new PrintWriter(socket.getOutputStream());

pw.println("Hello");

pw.flush();


BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String msg = br.readLine();

System.out.println(msg);


socket.close();



실습) www.daum.net 이라는 서버의 80번 포트에 접속해서 GET http://www.daum.net 이라는 메시지를 전송하고 응답을 받아서 콘솔에 출력하는 예제

package network;


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;


public class WebMain {


public static void main(String[] args) {

//소켓 통신을 이용해서 문자열을 전송하고 읽기 위한 변수

Socket socket = null;

BufferedReader br = null;

PrintWriter pw = null;


try {

//도메인을 IP주소로 생성

InetAddress daum = 

InetAddress.getByName("www.daum.net");

//소켓 연결 - daum의 80번 포트

socket = new Socket(daum, 80);

//GET http://www.daum.net 이라는 메시지를 전송

pw = new PrintWriter(socket.getOutputStream());

pw.println("GET http://www.daum.net");

pw.flush();

//서버가 전송해준 데이터 읽기

br = new BufferedReader(

new InputStreamReader(

socket.getInputStream()));

while(true) {

//한 줄 읽기

String line = br.readLine();

//읽은 데이터가 없으면 종료

if(line == null) {

break;

}

//읽은 데이터가 있으면 출력

System.out.println(line);

}

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}finally {

try {

if(pw != null)

pw.close();

if(br != null)

br.close();

if(socket != null)

socket.close();

}catch(Exception e) {}

}

}


}



2)TCP 통신

=>항상 구동 중인 서버와 클라이언트 간의 통신


- 서버 측

=>SocketServer 클래스의 생성자를 이용해서 서버를 생성하는데 이 때 포트번호를 설정할 수 있고 접속 개수를 제한 할 수 있습니다.

=>Socket accept()를 호출해서 클라이언트의 접속을 대기합니다.

클라이언트가 접속하면 클라이언트와 통신할 수 있는 Socket이 리턴됩니다.


-클라이언트 측

=>Socket 클래스의 객체를 생성할 때 서버의 IP 주소와 포트 번호를 설정해서 접속하면 됩니다.


서버 코드


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;


public class TCPServer {


public static void main(String[] args) {

//서버 소켓 과 클라이언트와 통신할 소켓 변수

ServerSocket serverSocket = null;

Socket socket = null;

try {

//서버소켓을 생성

serverSocket = new ServerSocket(10001);

System.out.println("서버 대기 중....");

//클라이언트의 접속을 대기

//클라이언트가 접속하면 클라이언트와 통신할 소켓을

//socket에 저장

socket = serverSocket.accept();

//클라이언트의 요청 읽기

BufferedReader br = 

new BufferedReader(

new InputStreamReader(

socket.getInputStream()));

//한 줄의 메시지를 읽어서 출력하기

String msg = br.readLine();

//클라이언트에게 메시지 전송

PrintWriter pw = 

new PrintWriter(socket.getOutputStream());

pw.println("서버가 보내는 메시지");

System.out.println("클라이언트 메시지:" + msg);

br.close();

pw.close();

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}finally {

try {

if(serverSocket != null) {

serverSocket.close();

}

if(socket != null) {

socket.close();

}

}catch(Exception e) {}

}

}


}


클라이언트 코드


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.InetAddress;

import java.net.Socket;


//클라이언트

public class TCPClient {


public static void main(String[] args) {

//서버와 통신할 소켓 변수

Socket socket = null;

try {

//접속할 서버의 주소 만들기

InetAddress addr = 

InetAddress.getByName("127.0.0.1");

//서버에 접속

socket = new Socket(addr,10001);

//서버에 메시지를 전송

PrintWriter pw = new PrintWriter(

socket.getOutputStream());

pw.println("서버 안녕 !!!!");

pw.flush();

//서버가 보낸 메시지 읽기

BufferedReader br = new BufferedReader(

new InputStreamReader(

socket.getInputStream()));

String msg = br.readLine();

System.out.println("서버가 보낸 메시지:" + msg);

pw.close();

br.close();

}catch(Exception e) {

System.out.println("예외:" + e.getMessage());

e.printStackTrace();

}finally {

try {

if(socket != null) {

socket.close();

}

}catch(Exception e) {}

}

}

}







'IT > JAVA (17.12.18~)' 카테고리의 다른 글

23일 JAVA(23) - 자바 달력(JAVA Calendar)  (0) 2018.02.05
23일 JAVA(23)  (0) 2018.01.24
21일 JAVA(21)  (0) 2018.01.23
20일 JAVA(20)  (0) 2018.01.16
19일 JAVA(19)  (0) 2018.01.16