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 |