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 |