본문 바로가기
코딩/JAVA

JAVA 겨울방학 9일차

by sonysame 2018. 1. 8.

JAVA NIO에서는 Buffer를 이용해서 데이터 입출력 진행

배열과 같은 연속된 메모리 공간

2가지 종류의 Buffer가 존재


-direct buffer(OS)

:OS영역에 생성되는 버퍼

:생성되는 시간은 상대적으로 길다(Native-C call을 이용해서 처리)->일반적으로 재서용

:크기는 OS가 제공하는 메모리 공간크기만큼 잡을 수 있다.

:효율은 더 좋다!



-non direct buffer(Java)

:Java Program내에서 생성되는 버퍼

:메모리 공간 Heap에 생성

:생성되는 시간은 상대적으로 짧다

:만들 수 있는 버퍼의 크기가 제한된다.

:상대적으로 속도는 느리다.


Channel->FileChannel을 이용한 파일처리까지 진행


package JavaNIO;


import java.nio.ByteBuffer;


public class Exam05_BufferCreate {


public static void main(String[] args) {

// TODO Auto-generated method stub

// Buffer는 몇몇개의 class로 우리에게 제공된다.

//CharBuffer, IntBuffer, ByteBuffer,...

//가장 기본이 되는 Buffer는 ByteBuffer

int capacity=1024; //1k byte의 버퍼크기로 설정

long startTime, endTime;

//시작 시간

startTime=System.nanoTime(); //현재시점의 특정시간 값을 알아온다.

//ms: 1/1000

//마이크로s: 1/1000,000

//ns: 1,000,000,000

//ps:1,000,000,000,000

ByteBuffer buffer=ByteBuffer.allocateDirect(capacity);

endTime=System.nanoTime(); //현재시점의 특정 시간 값을 알아온다.

System.out.println("Direct 걸린시간은 : "+(endTime-startTime));


}


}


package JavaNIO;


import java.nio.ByteBuffer;


public class Exam06_BufferMethod {


public static void main(String[] args) {

// TODO Auto-generated method stub

//non-direct buffer를 하나 만들어요!

ByteBuffer buffer=ByteBuffer.allocate(5);

System.out.println("position : "+buffer.position());

System.out.println("capacity : "+buffer.capacity());

System.out.println("limit : "+buffer.limit());

buffer.put((byte)'a');

buffer.put((byte)'b');

buffer.put((byte)'c');

System.out.println((char)buffer.get(1));

//mark는 position보다 작거나 같아야 한다.

buffer.rewind(); //position 값을 0으로 세팅

buffer.flip(); //position을 0으로 세팅(mark도 삭제)

//limit값을 아까 position위치로 설정

buffer.clear(); //position은 0으로

//limit은 capacity값으로

//mark는 삭제

//단, 데이터는 지워지지 않아요

}


}


package JavaNIO;


import java.nio.ByteBuffer;

import java.nio.charset.Charset;


public class Exam07_Charset {


public static void main(String[] args) {

// TODO Auto-generated method stub

// 문자열 "hello"를 ByteBuffer안에 넣고 싶다!

String msg="Hello";

Charset charset=Charset.forName("UTF-8");

ByteBuffer buffer=charset.encode(msg);

System.out.println("capacity : "+buffer.capacity());

System.out.println("limit : "+buffer.limit());

System.out.println("position : "+buffer.position());

//ByteBuffer 내에 데이터를 문자열로 전환

String newString=charset.decode(buffer).toString();

System.out.println(newString);

}


}


package JavaNIO;


import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.FileChannel;

import java.nio.charset.Charset;

import java.nio.file.Path;

import java.nio.file.Paths;

import java.nio.file.StandardOpenOption;


public class Exam08_FileRead {


public static void main(String[] args) {

// TODO Auto-generated method stub

//1. Path 설정

Path path=Paths.get("assets/test.txt");

Path path2=Paths.get("assets/text.txt");

//2. Buffer 준비

ByteBuffer buffer=ByteBuffer.allocate(20);

//3. Path에 대한 Channel을 열어요

try {

FileChannel fileChannel=FileChannel.open(path, StandardOpenOption.READ);

Charset charset=Charset.forName("utf-8");

while(true) {

int count=fileChannel.read(buffer);

if(count==-1) {

//파일 끝에 도달했다는 뜻! 루프를 탈출

break;

}

buffer.flip();

System.out.print(charset.decode(buffer).toString());

buffer.clear();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

try {

FileChannel fileChannel=FileChannel.open(path2, StandardOpenOption.WRITE);

String msg="배고파요..밥먹으러 가요.";

Charset charset=Charset.forName("utf-8");

ByteBuffer buffer2=charset.encode(msg);

fileChannel.write(buffer2);

fileChannel.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}


}


Network


Internet: network of network

IP: 컴퓨터에 할당된 주소

 ->NIC(Network Interface Card)에 할당된 논리적인 주소

MAC address: NIC에 부여된 실제 주소(물리적인 주소)

Protocol: HTTP

       FTP
       TCP/IP
       ARP

  .......


package JavaNetwork;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;


import javafx.application.Application;

import javafx.application.Platform;

import javafx.geometry.Insets;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.TextArea;

import javafx.scene.control.TextField;

import javafx.scene.layout.BorderPane;

import javafx.scene.layout.FlowPane;

import javafx.stage.Stage;


public class Exam02_EchoClient extends Application {


public static void main(String[] args) {

// TODO Auto-generated method stub

launch();

}


private TextArea textarea;

private BufferedReader br;

private PrintWriter pr;

private void printMsg(String msg) {

Platform.runLater(()->{textarea.appendText(msg+"\n");});

}

@Override

public void start(Stage primaryStage) throws Exception {

// TODO Auto-generated method stub

BorderPane root=new BorderPane();

root.setPrefSize(700, 500);

textarea=new TextArea();

textarea.setEditable(false);

root.setCenter(textarea);

FlowPane flowPane=new FlowPane();

flowPane.setPadding(new Insets(20,20,20,20));

flowPane.setHgap(10); //버튼간의 간격을 10 pixel로 지정

Button startBtn=new Button("서버 접속");

startBtn.setPrefSize(100, 30);

startBtn.setOnAction(event->{

//Socket을 생성한다는 말은, 서버쪽에 이 시점에 접속을 시도

try {

Socket socket=new Socket("localhost",5553);

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

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

} catch (UnknownHostException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

});

TextField idField=new TextField();

idField.setPrefSize(100, 30);

TextField msgField=new TextField();

msgField.setPrefSize(400, 30);

msgField.setOnAction(event->{

pr.println(idField.getText()+">"+msgField.getText());

pr.flush();

msgField.clear();

try {

String msg=br.readLine();

printMsg(msg);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

});

flowPane.getChildren().add(startBtn);

flowPane.getChildren().add(idField);

flowPane.getChildren().add(msgField);

root.setBottom(flowPane);

Scene scene=new Scene(root);

primaryStage.setScene(scene);

primaryStage.show();

}


}


package JavaNetwork;


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;


import javafx.application.Application;

import javafx.application.Platform;

import javafx.geometry.Insets;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.control.TextArea;

import javafx.scene.layout.BorderPane;

import javafx.scene.layout.FlowPane;

import javafx.stage.Stage;


// javaFX로 작성

public class Exam02_EchoServer extends Application {

   

   private TextArea textarea;

   private ExecutorService executorService = Executors.newFixedThreadPool(2);

   

   private void printMsg(String msg) {

      Platform.runLater(() -> {

         textarea.appendText(msg + "\n");

      });

   }

   

   @Override

   public void start(Stage primaryStage) throws Exception {

      

      BorderPane root = new BorderPane();

      root.setPrefSize(700, 500);

      

      textarea = new TextArea();

      textarea.setEditable(false);

      root.setCenter(textarea);

      

      FlowPane flowPane = new FlowPane();

      flowPane.setPadding(new Insets(20, 20, 20, 20));

      flowPane.setHgap(10); // 버튼간의 간격을 10pixel로 설정

      

      Button startBtn = new Button("서버시작");

      startBtn.setPrefSize(100, 30);

      startBtn.setOnAction(event -> {

         // 서버쪽 실행은 ServerSocket부터 시작.(port : 5554)

         Runnable runnable = new Runnable() {


            @Override

            public void run() {

               try {

                  ServerSocket serverSocket = new ServerSocket(5553);

                  printMsg("서버기동. 클라이언트 접속 대기중!!");

                  Socket socket = serverSocket.accept(); // blocking되면서 클라이언트의 접속을 기다려요! 대기하고 있다가 클라이언트가 접속하면 클라이언트와 연결된 Socket을 리턴해요.

                  printMsg("클라이언트 접속!!");

                  // 클라이언트가 보낸 데이터를 받아서 다시 보내줘야하니.. InputStream과 OutputStream 둘 다 있어야 해요.

                  // 입력은 BufferedReaader, 출력은 PrintWriter

                  // 두 개의 Stream을 socket으로부터 뽑아내요.

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

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

                  String msg = null;

                  while((msg = br.readLine()) != null) {

                   String[] split=msg.split(">");

                   if(split[1].equals("/exit")) {

                   break;

                   }

                     

                     pr.println(msg+"><");

                     pr.flush();

                  }

                  br.close();

                  pr.close();

                  socket.close();

                  serverSocket.close();

               } catch (IOException e) {

                  // TODO Auto-generated catch block

                  e.printStackTrace();

               }

            }

         };

         executorService.execute(runnable);

         

      });

      

      Button stopBtn = new Button("서버중지");

      stopBtn.setPrefSize(100, 30);

      stopBtn.setOnAction(event -> {

         

      });

      

      flowPane.getChildren().add(startBtn);

      flowPane.getChildren().add(stopBtn);

      

      root.setBottom(flowPane);

      Scene scene = new Scene(root);

      primaryStage.setScene(scene);

      primaryStage.show();

   }

   

   public static void main(String[] args) {

      launch();      

   }


}



'코딩 > JAVA' 카테고리의 다른 글

JAVA 겨울방학 8일차  (0) 2018.01.04
JAVA 겨울방학 7일차  (0) 2018.01.04
JAVA 겨울방학 6일차  (0) 2018.01.03
겨울방학 JAVA 4일차  (0) 2017.12.29
겨울방학 JAVA 3일차  (0) 2017.12.28