728x90

부인 방지 (Non Repudiation)

보안 요건 중 데이터의 송수신자가 송수신 사실을 추후에 부정하지 못하도록 송수신 증거를 제공하는 것


비트코인

온라인 가상 디지털 화페.


NFC

고주파 (HF)를 이용한 근거리 무선통신 기술. 모바일 기기에서 결제 뿐만 아니라 여행정보전송, 교통, 출입통제 등에 광범위하게 사용된다.


VHT (Very High Throughput)

IEEE에서 802.11n 후속으로 진행하는 표준안. 802.11n 대비 2배 이상의 전송속도(1 Gbps), 압축되지 않은 HD 동영상 전송을 가능하게 하며, 개선된 커버리지와 전력 소모 기능을 갖는다. 기존 무선랜 사양들에 대한 하위 호환성을 지원한다.


프록시 서버

PC 사용자와 인터넷 사이에서 중개자 역할을 하는 서버로 크게 방화벽 기능과 캐시 기능을 수행한다.


데이터 암호화 표준 DES [Data Encryption Standard ]

개인키를 사용하여 데이터를 암호화 하는 방법. 미국방성에서 자료 암호화 표준으로 채택하여 사용


라이버시 강화 기술 PET (Privacy Enhancing Technology)

개인 정보 위험 관리 기술. 개인 정보 침해 위험을 관리하기 위한 핵심 기술로 암호화, 익명화 등 개인 정보를 보호하는 기술에서 사용자가 직접 개인 정보를 통제하기 위한 기술까지 다양한 사용자 프라이버시 보호 기술을 통칭함. 



고성능 연산 코딩 HVC (High perfomance Video Coding) 


사용자 제작 콘텐츠 UCC (User Created Contets)


메시지 

객체간의 상호작용을 위한 수단, 객체에게 어떤 행위를 하도록 지시하는 명령 또는 요구사항이다.


다형성

객체가 연산을 수행할 때 하나의 메시지에 대해 각 개체가 지니고 있는 고유한 방법으로 응답할 수 있는 능력


IMS (Internet Protocol Multimedia Subsystem)

인터넷 프로토콜을 기반으로 음성, 오디오, 비디오 및 데이터 등의 멀티미디어 서비스를 제공하는 규격.


제로 데이 공격(Zero Day Attack)

보안 취약점이 발견되었을 때, 취약점을 보완하거나 존재가 널리 공표되기전에 해당 취약점을 악용하여 이루어지는 보안 공격


데이터 유출 방지 DLP [Data Loss Prevention, Data Leakage/Loss Prevention]

내부정보 유출 방지 솔루션. 사내 직원이 사용하는 PC와 네트워크상의 모든 정보를 검색하고 사용자의 행위를 탐지·통제해 외부 유출을 사전에 차단한다.


랜섬 웨어 (Ransomware)

인터넷 사용자의 컴퓨터에 잠입해 내부 문서나 파일 등을 암호화하여 사용자가 열지 못하도록 만든 후, 암호 해독을 조건으로 돈을 요구하기도 하는 신종 악성 프로그램


봇넷 (Botnet)

악성 프로그램에 감염되어 향후 악의적인 의도로 사용될 수 있는 다수의 컴퓨터들이 네트워크로 연결된 형태


포스퀘어 Foursquare

사용자가 어떤 장소나 지역을 방문할 때 자신의 위치를 지도상에 표시하고, 방문한 곳의 정보를 남길 수 있는 체크인 기능을 제공하는 소셜네트워킹서비스(SNS)  http://terms.naver.com/entry.nhn?docId=2009645&cid=43667&categoryId=43667



TCP/IP (Transmission Control Protocol/Internet Protocol)


EDI 전자자료교환 (Electronic Data Interchange)

기업간에 데이터를 효율적으로 교환하기 위해 지정한 데이터와 문서의 표준화 시스템


Cyber Bullying 사이버 왕따

: 특정인을 사이버상에서 집단적으로 따돌리거나 집요하게 괴롭히는 행위


Transaction 

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 일련의 연산집합으로서 작업의 단위


매시업 Mashup 

웹서비스 업체들이 제공하는 각종 콘텐츠와 서비스를 융합하여 새로운 웹서비스를 만들어내는 것


파밍 Pharming 

합법적으로 소유하고 있던 사용자의 도메인을 탈취하거나 DNS 또는 프락시 서버의 주소를 변조함으로써 사용자들로 하여금 진짜 사이트로 오인하여 접속하도록 유도한 뒤에 개인정보를 훔치는 컴퓨터 범죄 수법. 



MVC

상호작용 어플리케이션을 model, view, controller의 세 개의 컴포넌트로 구분하는 아키텍처로, UI와 비즈니스 로직들을 서로 분리하여 개발하는 방법

장점 : 동일한 모델에 대해 다양한 뷰를 제공하고 모델과 뷰의 구분으로 사용자 인터페이스에 대한 요구사항을 적용시키는데 용이


객체지향 기법

객체 기향 기법을 사용하는 소프트웨어 개발 과정의 가장 큰 특징은 각 과정에서 사용되는 객체, 클래스, 메소드, 속성 등이 동일한 개념으로 사용되는 것이다.

객체지향의 생명 주기 : 1. 계획 및 분석    2. 설계    3. 구현    4. 테스트 및 검증


VPN(Virtual Private Networks)

공공회선을 사용해 노드를 연결하는 것(public wires to connect nodes)으로 구축되는 네트워크. 


PKI(공개 키 기반 구조)


GPS(위성 위치 확인 시스템)


디지털 발자국 (Digital Footprint)

사람들이 여러 웹페이지에 로그인하거나 결제 정보를 입력하는 등 온라인 활동을 하면서 남긴 기록.


DRM (Digital Rights Management)

데이터의 안전한 배포를 활성화, 불법 배포 방지. 디지털 데이터의 저작권을 보호하기 위한 시스템.


CCL (Creative Commons Licence)

저작권자가 자신의 저작물에 대한 이용방법 및 조건을 표기하는 저작물 이용 약관. (저작권 표시, 비영리, 변경금지, 동일조건 변경허락으로 분류)


SSL (Secure Sockets Layer)

데이터를 송수신하는 두 컴퓨터 사이, TCP/IP계층과 응용 계층 사이에 위치하여 인증, 암호화, 무결성을 보장하는 업계 표준 프로토콜. 전송되는 데이터를 암호화하며 인증서를 필요로 한다.


AMR (Automatic Meter Reading)

전기, 가스, 수도 계량기 등을 검침원이 고객을 방문하지 않고 원격에서 단말기를 이용해 검침 데이터를 읽는 등 컴퓨터 프로그램과 연계에 파악가능한 시스템


소셜 큐레이션 (Social Curation)

사용자가 자기 취향대로 사진이나 그림, 동영상 등을 수집하고 가공해 인터넷에서 다른 여러사람과 공유하는 것


증강현실 (Augmented Reality : AR)

실세계에 3차원 가상 물체를 겹쳐 보여주는 것으로 현실에 기반을 두고 실세계 환경과 그래픽 형태의 가상 현실을 실시간으로 합성하여 실세계에 대한 이해를 높여주는 기술. (예 : 스포츠 중계시 등장하는 선수의 데이터, HMD로 사용자가 보는 실제 환경에 컴퓨터 그래픽스, 문자 등을 겹쳐 보여주는 것)




클래스

유사한 객체들을 묶어 공통된 특성을 표현한 데이터 추상화, 속성과 연산을 정의하는 틀


기가 파이(Giga Fi)

60 GHz 대역을 이용해 데이터를 기가급으로 전송할 수 있는 기술, 전파 거리가 짧고 직진성이 강해 주변 간섭에 매우 강하고 보안성이 뛰어나 주파 재사용이 용이. 홈 네트워크나 실내 무선랜 지원에 적합한 기술


트랙백(Trackback)

내 블로그 포스트의 일정 부분이 다른 사람의 댓글로 보이게 하는 것


정보 은닉

다른 객체에게 자신의 정보를 숨기고 자신의 연산만을 통한 접근을 허용하는 것


백 도어(Back Door 또는 Trap Door)

서비스 기술자나 유지 보수 프로그래머가 access 편의를 위해 고의로 만들어 놓은, 시스템 보안이 제거된 비밀 통로.

프로그램 보수의 용이성을 위해 코드 중간 중간에 백 도어라는 중단 부분을 설정하는데, 최종 단계에서 이 단계를 남겨두면 컴퓨터 범죄에 악용될 위험이 있다.


i-PIN (internet Personal Identification Number)

인터넷에서 주민 번호 대신 쓸 수 있도록 만든 사이버 주민 등록 번호


노모포비아(Nomophobia)

스마트폰이 곁에 없을 때 불안감이나 두려움을 느끼는 증상. 의사 소통과 정보 단절의 두려움과 불안감을 느끼게 된다.


메타 데이터

메타 데이터의 상호 운영성을 확보하기 위한 방법에는 자원을 하나의 표준적인 메타 데이터로 통합하여 표현하는 방법,

자원의 특성을 감안하여 다양한 메타 데이터 형식과 기술 구조를 인정하고 상호 매핑을 통해 해결하는 방법 등이 있다.



APT(지능형 지속 위협) : Advanced Persistent Treats



USIM(범용 가입자 식별 모듈) : Universal Subscriber Identity Module

사용자의 인증을 목적으로 휴대전화 사용자의 개인정보(전화번호, 로밍정보 등)를 저장하는 모듈로서 스마트 카트로 제작된다. 보안기능으로 휴대전화 분실/교체시 개인정보 보호가 가능하고, 보안 등이 요구되는 지불 및 인증 기능을 제공하는 등 활용범위가 광범위하다.



DDoS(Distributed Denial of Service)

단일 시스템을 표적으로 훼손된(보통 트로이 목마에 감염된) 여러 시스템을 사용해 서비스 거부 공격(Denial of Service: Dos)를 유발하는 공격 기법.

표적이 된 시스템 및 해커의 제어 하에 분산 공격에 부당하게 사용된 모든 시스템이 (DDos)공격의 피해자가 된다.



소셜 엔지니어링(Social Engineering)

신뢰를 바탕으로 사람들을 속여 정상 보안 절차를 깨트리는 비 기술적 침입 수단.

통신망 보안 접근권한이 있는 담당자와 신뢰를 쌓고 그들의 약점과 도움을 이용한다.



타이포스쿼팅 Typosquatting ( 혹은 URL 하이재킹(hijacking) )

네티즌들이 사이트에 접속할 때 주소를 잘못 입력하거나 철자를 빠뜨리는 실수를 이용하기 위해 이와 유사한 유명 도메인을 미리 등록하는 일. 



VOD(Video On Demand : 수요에 의한 비디오)



클라우드 컴퓨팅

중앙의 대형 데이터 센터의 컴퓨팅 자원을 필요한 이들에게 필요한 순간에 적절하게 배분하여 공급하는 방식.


그리드 컴퓨팅

수 많은 컴퓨터를 하나의 컴퓨터처럼 묶어 분산 처리하는 방식



IoT (사물 인터넷, Internet of Things)



비컨(Beacon)

블루투스 4.0을 기반으로 주변의 일정 반경 범위(수십 미터) 내에서 사물의 정보(ID)를 주기적으로 전송하는 근거리 무선 통신 기술.



객체지향 구현

객체지향 설계 단계에서 생성된 설계 모델과 명세서를 근거로 하여 코딩하는 단계. 객체는 순차적으로 또는 동시적으로 구현 가능



IEEE 1417

소프트웨어 집약적 시스템에서 아키텍처가 표현해야 하는 요소와 내용들, 이들 간의 관계를 규정하고 있는 국제 표준.

대표적 특징으로 표준화, 중립성, 유연성, 의사소통 이 있다.



빅 데이터 (Big Data) 

기존의 관리 방법이나 본석 체계로는 처리하기 어려운 막대한 양의 정형 또는 비정형 데이터 집합


URL (Uniform Resource Locator)

인터넷 상에 존재하는 각종 자원이 있는 위치를 나타내는 표준 주소 체계




객체명 서비스 [Object Name Service ]

정보가 있는 올바른 컴퓨터를 가리키는 자동화 네트워킹이다. RFID 태그에는 EPC(Electronic Product Code)만 저장되므로 관련 품목에 대한 정보와 EPC를 맞춰보는 몇 가지 방법을 진행한다. 즉 RFID 코드와 관련된 사물의 구체적인 정보가 있는 서버의 위치를 알려 주는 서비스이다.


직교주파수분할 [OFDM/Orthogonal Frequency Division Multiplexing ]

고속의 데이터를 각 반송파가 직교 관계에 있는 다수의 부 반송파에 나누어 실어, 다중 전송하는 디지털 변조 방식



RFID (Radio Frequency Identification)

이론상 바코드 식별과 유사한 기술. 무선 주파수를 읽어서 처리장치로 정보를 전송하는 안테나와 송-수신기,

그리고 RF 회로가 내장된 통합회로, 전송할 정보를 담고있는 태그로 구성.


PKI (Public Key Infrastructure)

공개키 암호화 시스템을 안전하게 사용할 수 있도록 필요한 서비스를 지원해주는 기반 구조, 사용자들이 안전하게 데이터를 교환할 수 있게 해줌



APT (Advanced Persistent Threats)

다양한 IT 기술과 방식들을 이용해, 조직적으로 특정 기업이나 조직 네트워크에 침투해 활동 거점을 마련한 뒤에

때를 기다리면서 보안을 무력화시키고 정보를 수집한 다음 외부로 빼돌리는 형태의 공격

ex) 내부자에게 악성코드가 포함된 이메일을 오랜 기간 꾸준히 발송해 기다리는 형태, 악성 코드가 담긴 USB등으로 전파하는 형태 등




728x90

라즈베리 파이3, 기본 설정

 

홈페이지  https://www.raspberrypi.org/

 

Raspbian Jessie 풀버전 다운로드

https://downloads.raspberrypi.org/raspbian_latest

 

 

Win32DiskImager 다운로드 (0.95 추천)

https://sourceforge.net/projects/win32diskimager/files/Archive/


SD카드 포맷을 위한 포매터

https://www.sdcard.org/downloads/formatter_4/eula_windows/index.html


 

Device항목에 sd카드 드라이브명 확인후,

다운받은 Raspbian 이미지를 디스크 모양 아이콘을 눌러 선택하고 Write를 누른다.

 

 

 

 

[라즈베리 파이, 기본 세팅]

전원을 꼽는 순간 부팅된다.


sudo : SUbstitute user DO 의 줄임말, 관리자 권한의 계정으로 명령을 내림

su - : root권한 획득


$ : 일반계정

# : 루트계정 (sudo)


Ctrl + D : 로그아웃, 한번 더 입력하면 창을 닫는다.


apt-get 프로그램을 받음, 설치시 install 명령어를 뒤에 같이 씀

-> install (대상)

예) sudo apt-get install vim


sudo raspi-config // 라즈베리 파이 환경설정

1. Expand Filesystem // 파일시스템 확장(SD 카드 전체용량 사용하도록 확장)
2. Change User Password // pi계정 비밀번호 변경

5. Internationalisation Options  //언어, 키보드,타임존 등을 설정

sudo apt-get update  // 각 업데이트 저장소 에서 업데이트 패키지 목록을 갱신

apt-get 프로그램 받아서 설치해줌




[ 네트워크 설정 ]



네트워크 설정 파일을 찾아서 편집

1
cd /etc/network/
cs

interfaces 수정

1
sudo nano interfaces
cs

다음과 같이 수정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# interfaces(5) file used by ifup(8) and ifdown(8)
 
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
 
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
 
auto lo
iface lo inet loopback
 
auto eth0
allow-hotplug eth0
iface eth0 inet manual
 
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
cs


Ctrl + x 누르고 Y눌러 저장 후 엔터눌러 종료



wap_supplicant.conf 수정

1
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
cs

다음과 같이 수정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
 
network={
        ssid="Xiaomi"
        psk="12345678"
        key_mgmt=WPA-PSK
}
 
network={
        ssid=""
        psk=""
        key_mgmt=WPA-PSK
}
cs


네트워크 재시작

1
 sudo service networking reload
cs


그 다음 sudo reboot 또는 셧다운 메뉴를 통해 라즈베리 재시작



ifconfig를 통해 eth0또는 wlan의 ip주소를 확인한다 ( inet addr:192.168.~ )



원격 데스크탑 연결을 하려면

 sudo apt-get install xrdp  


원격 데스크탑 연결에서 사용자 명 pi를 넣어 접속


putty에서 접속하려면
호스트네임에 라즈베리파이 ip주소를 넣어 접속하고 기본 계정명(pi)와 비밀번호를 입력해 접속한다.



IP고정 및 포트포워딩


1
 sudo nano /etc/dhcpcd.conf
cs


최하단에 아래의 설정을 추가 (IP나 라우터, dns등은 자신의 네트워크 환경에 맞게 설정)

1
2
3
4
5
6
7
8
9
10
11
interface eth0
static ip_address=210.119.12.~
static routers=210.119.12.1
static domain_name_servers=210.119.0.2
static netmask=255.255.255.0
 
interface wlan0
static ip_address=
static router=
static domain_name_servers=8.8.8.8
static netmask=255.255.255.0
cs



그 다음 공유기 설정에서 포워딩 IP 주소를 고정 IP주소로 설정, DMZ 설정에도 마찬가지로 고정 IP주소로 설정하면 된다.

'Study > Embedded' 카테고리의 다른 글

GCM  (0) 2017.06.27
라즈베리파이, Pi4J를 통한 GPIO 제어  (0) 2017.06.20
아두이노 LCD  (0) 2017.06.01
아두이노 기초  (0) 2017.05.25
ATMEGA USART-C# App 연동  (0) 2016.12.12
728x90

타이틀 바 제거

styles.xml에서 다음의 코드를 추가

<item name="windowNoTitle">true</item>



코드로 앱 이름 변경 

strings.xml에서 다음의 코드를 추가

<resources>
<string name="app_name">Hello</string>
</resources>




안드로이드 스튜디오 단축키


CTRL + Q : API 레퍼런스


CTRL + P : 커서가 위치한 메소드의 매개변수 정보보기


CTRL + ALT + L : 코드 정렬

'Mobile App Develop > Etc.' 카테고리의 다른 글

이클립스 단축키  (0) 2017.07.04
정보처리 - 업무 프로세스  (0) 2017.06.20
여러 언어의 레퍼런스를 제공하는 프로그램 - Zeal  (0) 2017.05.30
visual studio 단축키  (0) 2017.04.13
vs code 설정  (0) 2017.04.05
728x90

Java Network 프로그래밍 기초 

( 참고 서적 : 자바 네트워크 프로그래밍 [자바 8과 함께하는 네트워크 애플리케이션 개발] )


IP 주소를 나타내는 InetAddress 클래스


InetAddress 클래스는 public 생성자가 없으므로 여러 static type의 get 메소드 중 하나를 사용한다. (.get~~)

다음은 특정 사이트의 ip주소를 얻는 예제이다. 


1
2
3
4
5
6
7
8
9
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class Address {
    public static void main(String[] args) throws UnknownHostException {
         InetAddress address = InetAddress.getByName("www.packtpub.com");
         System.out.println(address);
    }
}
cs


결과 : 

www.packtpub.com/83.166.169.231


해당 주소의 접속 여부를 결정하기 위해 필요한 대기시간을 다음과 같이 지정할 수 있다.

isReachable 메소드의 인자는 m/s 단위의 대기 시간이다.


1
 address.isReachable(3000);
cs




NIO 지원



selector : 다중 채널을 처리하기 위한 싱글 스레드를 허용하는 기술




자바 서버와 안드로이드 클라이언트 연동


Server.java 의 전체 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
    public static void main(String[] args) {
        ServerStart();
    }
 
public static void ServerStart() {
    try {
        int portNum = 11001;
 
        System.out.println("서버 시작이당");
        @SuppressWarnings("resource")
        ServerSocket serverSocket = new ServerSocket(portNum);
        System.out.println(portNum);
 
        while (true) {
            Socket socket = serverSocket.accept();
            InetAddress clientHost = socket.getInetAddress();
            int clientPort = socket.getPort();
            System.out.println("클라이언트 접속, 호스트 : " + clientHost + ", port : " + clientPort);
 
            ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
            Object obj = inputStream.readObject();
            System.out.println("Input : " + obj);
 
            ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
 
            outputStream.writeObject(obj + " 서버로부터 메시지 ");
            outputStream.flush();
            socket.close();
        }
    }
    
    catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
 
cs



안드로이드 클라이언트


인터넷을 사용하기 위해 AndroidManifest.xml에 유저 권한 추가

<uses-permission android:name="android.permission.INTERNET" />


클라이언트 레이아웃 (activity_main.xml 디자인)




MainActivity.java의 전체 소스

package com.example.pknu.hello;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

EditText input01;
Button button01;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

input01 = (EditText) findViewById(R.id.input01);

// 버튼 이벤트 처리
button01 = (Button) findViewById(R.id.button01);
button01.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String addr = input01.getText().toString().trim();

ConnectThread thread = new ConnectThread(addr);
thread.start();
}
});

}

class ConnectThread extends Thread {
String hostname;

public ConnectThread(String addr) {
hostname = addr;
}

public void run() {

try {
int port = 11001;

Socket sock = new Socket(hostname, port);
ObjectOutputStream outstream = new ObjectOutputStream(sock.getOutputStream());
outstream.writeObject("Hello AndroidTown on Android");
outstream.flush();

ObjectInputStream instream = new ObjectInputStream(sock.getInputStream());
String obj = (String) instream.readObject();

Log.d("MainActivity", "서버에서 받은 메시지 : " + obj);

sock.close();

} catch(Exception ex) {
ex.printStackTrace();
}

}
}
}



'Study > Java' 카테고리의 다른 글

자바 - 식별자  (0) 2021.01.06
자바 NIO 셀렉터  (0) 2017.07.05
NIO 기반 네트워킹  (0) 2017.05.30
JAVA - NIO  (0) 2017.05.29
Java - OOP_인터페이스와 다형성  (0) 2017.03.20
728x90

SQL injection


SQL 삽입은 데이터베이스를 엑세스하기 위해 동적 SQL 문을 사용하는 경우, 사용자로부터 입력된 값이 검증 작업없이 쿼리문을 생성하기 위한 일부로 사용할 때 발생한다. (동적 SQL 문이란 외부 입력값을 이용하여 SQL문을 실행하는 것을 말한다.)


모든 종류에 DBMS에 적용 가능한 공격기법으로, 이 공격을 통해 불법적인 로긴과 DB 엑세스, 프로시저를 통한 운영체제 명령어 수행이 가능해지므로 치명적 피해를 입을 수 있다.



비 정상적 입력값으로 인증 우회


사용자명 : ' or 'a'='a

비밀번호 : ' or 'a'='a





Error Based SQL Injection Check(에러 기반 SQL 삽입 체크)


서버에서의 에러 메시지가 브라우저가 그대로 출력된다면 공격자에게 많은 정보를 제공하게 된다.

MS-SQL로 가지고 이를 테스트해보겠다.


예 1) 싱글 쿼터( ' )를 사용했을 때의 에러 메시지

입력 값 : test'


에러 메시지 :

문자열 'test''의 따옴표가 짝이 맞지 않습니다.

'test'' 근처의 구문이 잘못되었습니다.



예 2)  테이블 명 추출 (집계함수를 가지고 조건 비교를 할 때 사용하는 having절 사용)

입력 값 : ' having 1=1 --


에러 메시지 : 

열 'tbl_user.name'이(가) 집계 함수나 GROUP BY 절에 없으므로 SELECT 목록에서 사용

할 수 없습니다.


select 문의 컬럼에 대한 GROUP BY절이 기술되어 있지 않을 때 위와 같은 에러가 발생한다.

위 에러 메시지에서 테이블 이름이 tbl_user이며 첫번째 칼럼 이름이 name인 것을 확인 가능하다.


예 3) DB 이름 추출
입력 값 : ' and db_name() =1 --

에러 메시지 :
nvarchar 값 'ADO'을(를) 데이터 형식 int(으)로 변환하지 못했습니다.

DB 이름과 숫자 1을 비교하도록 쿼리문을 조작해 에러 메시지를 발생 시킨다. 이를 통해 DB 이름이 ADO라는 것을 확인 가능하다.




SQL 인젝션을 방지하는 방법

C# 서버 기준 -  SqlParameter를 사용
SqlCommand cmd;
SqlDataReader sqlReader = null;
cmd.CommandText = @"SELECT * FROM tbl_user WHERE name=@userName AND pass=@password";
cmd.Parameters.AddWithValue("@userName", field[0]);
cmd.Parameters.AddWithValue("@password", field[1]); 
                                       
sqlReader = cmd.ExecuteReader();
로그인 완료 후나, 아이디 비밀번호 불일치 시에는 sqlReader를 닫고 parameter를 clear해준다.

sqlReader.Close();     cmd.Parameters.Clear();


"SQLSERVER SP 개체이름이 잘못되었습니다" 오류가 날 때 해결법
: You need to refresh the Intellisense cache (Ctrl + Shift + R). Or you can go to Edit -> IntelliSense -> Refresh Local Cache.


C# 서버 기준 - 저장 프로시저 사용

SQL-SERVER에서의 저장 프로시저

1
2
3
4
5
6
7
8
CREATE PROCEDURE FindName
( @name nchar(10) )
AS  
BEGIN
   DECLARE @sql nvarchar(255)
   SET @sql = 'SELECT * FROM tbl_user WHERE name = @userName'
   exec sp_executesql @sql, N'@userName nchar(10)', @name
END;
cs


C# 서버의 코드
1
2
3
4
cmd.CommandText = "FindName";
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter uInput = new SqlParameter("@name", field[0]);
cmd.Parameters.Add(uInput);
cs


C# 서버 기준 - 특수 문자 필터링

정규식을 사용해 특수문자를 필터링한다. (3~8자로 제한)
1
2
3
4
5
6
 bool idChecker = Regex.IsMatch(field[0], @"[0-9a-zA-Z]{3,8}$");
 
if (idChecker == false)
{
    return//Console.WriteLine("잘못된 아이디 형식 입니다.");
}
cs


'DB' 카테고리의 다른 글

[오라클 DB] 설치 및 접속  (0) 2017.07.08
데이터 베이스 기초  (0) 2017.06.14
MySQL 기초 공부  (0) 2017.05.30
SQL Server 2014 설치방법  (0) 2017.03.17
MySQL 설치 및 기초  (0) 2017.03.06
728x90

D pin에 다음과 같이 연결한다.

RS - 12, RW - 11, EN - 10

DATA 4~7 - D4~1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <LiquidCrystal.h>
 
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(121154321);
 
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(162);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}
 
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(01);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}
cs

LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)



'Study > Embedded' 카테고리의 다른 글

라즈베리파이, Pi4J를 통한 GPIO 제어  (0) 2017.06.20
라즈베리 파이3, 기본 설정  (0) 2017.06.10
아두이노 기초  (0) 2017.05.25
ATMEGA USART-C# App 연동  (0) 2016.12.12
7/21 Atmega128 포트/ win32 api  (0) 2016.07.21
728x90

서버소켓 채널 생성과 다중 클라이언트 연결 수락 (서버)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ServerTest {
 
    public static void main(String[] args) {
        ServerSocketChannel serverSocketChannel = null;
        
        try {
            serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.configureBlocking(true);
            serverSocketChannel.bind(new InetSocketAddress(5001));
            
            while(true) {
                System.out.println("연결 대기..");
                SocketChannel socketChannel = serverSocketChannel.accept();
                InetSocketAddress inetSockAddr = (InetSocketAddress) socketChannel.getRemoteAddress();
                System.out.println("연결 수락!" + inetSockAddr.getHostName());
                
                ByteBuffer byteBuffer = null;
                Charset charset = Charset.forName("UTF-8");
                
                byteBuffer = ByteBuffer.allocate(100);
                int byteCount = socketChannel.read(byteBuffer);
                byteBuffer.flip();
                String message = charset.decode(byteBuffer).toString();
                System.out.println"[데이터 수신 성공] : " + message);
                
                byteBuffer = charset.encode("Hello Client");
                socketChannel.write(byteBuffer);
                System.out.println"[데이터 전송 성공]");
            }
        }
        catch (Exception e) {
        }
        
        if (serverSocketChannel.isOpen()) {
            try {
                serverSocketChannel.close();
            } catch (Exception e) {
            }
        }
    }
}
cs


소켓 채널 생성과 연결 요청 (클라이언트)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ClientTest {
    public static void main(String[] args) {
        SocketChannel socketChannel = null;
        try {
            socketChannel = SocketChannel.open();
            socketChannel.configureBlocking(true);
            System.out.println"[연결 요청]");
            socketChannel.connect(new InetSocketAddress("localhost"5001));
            System.out.println"[연결 성공]");
            
            ByteBuffer byteBuffer = null;
            Charset charset = Charset.forName("UTF-8");
            
            // client가 데이터(헬로서버) 보냄
            byteBuffer = charset.encode("Hello Server");
            socketChannel.write(byteBuffer);
            System.out.println"[데이터 전송 성공]");
            
            // client가 데이터 받음
            byteBuffer = ByteBuffer.allocate(100);
            int byteCount = socketChannel.read(byteBuffer);
            byteBuffer.flip();
            String message = charset.decode(byteBuffer).toString();
            System.out.println"[데이터 수신 성공] : " + message);
            
        } catch(Exception e) {}
        
        if(socketChannel.isOpen()) {
            try {
                socketChannel.close();
                System.out.println"[연결 닫음]");
            } catch (IOException e1) {}
        }    
    }
}
cs



'Study > Java' 카테고리의 다른 글

자바 NIO 셀렉터  (0) 2017.07.05
Java Network 프로그래밍 기초  (0) 2017.06.03
JAVA - NIO  (0) 2017.05.29
Java - OOP_인터페이스와 다형성  (0) 2017.03.20
Java - OOP_클래스와 상속, 생성자, 오버로딩/오버라이딩  (0) 2017.03.17
728x90


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
create database iot;    -- db생성
show databases;    -- db 보여주기
use iot;    -- 사용할 db 선택
show tables;    -- 현재 선택된 db의 테이블 보여줌
 
create table dept (    
deptno int(2primary key,    -- 칼럼명/type/제약조건
dname varchar(20not null,
loc varchar(20)
ENGINE = InnoDB;
desc dept; -- table 스키마 보기
 
create table emp(
empno int(4primary key,
ename varchar(10not null,
job varchar(20not null,
mgr int (4),
hiredate date, -- 입사일
sal int(8),    -- 연봉
comm int(8),    -- 커미션
deptno int(2),    -- 부서 번호
FOREIGN KEY fk_dept(deptno) 
REFERENCES dept(deptno)
ENGINE = InnoDB; -- dept테이블의 deptno칼럼 참조
 
desc emp;
 
-- 관계된 테이블의 데이터 없이 참조하려고 하면 error
-- insert into emp values(1111, 'aaa', 'aaa', 1111, '2017/05/30', 3000, null, 10); 
 
insert into dept values(10'ACCOUNTING''NEW YORK');
insert into dept values(20'RESEARCH''DALLAS');
insert into dept values(30'SALES''CHICAGO');
insert into dept values(40'OPERATING''BOSTON');
 
select * from dept;
desc emp;
 
insert into emp values(7369'SMITH''CLERK'79021980/12/17800null20);
insert into emp values(7499'ALLEN''SALESMAN'7698'1981/02/20'160030030);
insert into emp values(7521'WARD''SALESMAN'7698'1981/02/22'125050030);
insert into emp values(7566'JONES''MANAGER'7839'1981/04/02'2975null20);
insert into emp values(7654'MARTIN''SALESMAN'7698'1981/09/28'1250140030);
insert into emp values(7698'BLAKE''MANAGER'7839'1981/05/01'2850null30);
insert into emp values(7788'SCOTT''ANALYST'7566'1987/04/19'3000null20);
insert into emp values(7839'KING''PRESIDENT'null'1981/11/17'5000null10);
insert into emp values(7844'TURNER''SALESMAN'7698'1981/09/08'1500030);
insert into emp values(7876'ADAMS''CLERK'7788'1987/05/23'1100null20);
insert into emp values(7900'JAMES''CLERK'7698'1981/12/03'950null30);
insert into emp values(7902'FORD''ANALYST'7566'1981/12/03'3000null20);
insert into emp values(7934'MILLER''CLERK'7782'1982/01/23'1300null10);
insert into emp values(7782'CLARK''MANAGER'7839'1981/06/09'2450null10);
 
select * from emp;
 
insert into dept values(10'aaa''aaa'); -- 기본키 중복 error
insert into dept values(50null'aaa'); -- dname은 not null이므로 error
insert into dept values(50'aaa''aaa'); -- error없이 정상 삽입
 
select * from dept where loc='NEW YORK';
select deptno from dept;
 
SELECT @@AUTOCOMMIT;  -- 오토커밋 여부를 조회
set autocommit=FALSE; -- 0으로 설정(0, FALSE: 해제 / 1,TRUE : 활성화)
 
delete from dept where deptno=50;
-- commit; 
 
select * from dept;
rollback; 
 
cs


'DB' 카테고리의 다른 글

데이터 베이스 기초  (0) 2017.06.14
SQL injection (SQL 삽입)  (0) 2017.06.01
SQL Server 2014 설치방법  (0) 2017.03.17
MySQL 설치 및 기초  (0) 2017.03.06
SQLD 관련 자료 & 사이트  (0) 2017.03.05
728x90

https://zealdocs.org/


한 프로그램에서 여러 언어의 레퍼런스를 제공하고 다운받으면 오프라인으로도 볼 수 있습니다. 

Docsets에서 Add feed하시면 됩니다. (C#관련은 net framework 설치)



'Mobile App Develop > Etc.' 카테고리의 다른 글

정보처리 - 업무 프로세스  (0) 2017.06.20
안드로이드 앱, 타이틀 바 없애기  (0) 2017.06.08
visual studio 단축키  (0) 2017.04.13
vs code 설정  (0) 2017.04.05
OpenCvSharp3-AnyCPU  (0) 2017.03.05
728x90

NIO (New Input/Output)    (참고 서적 : 이것이 자바다)


java.nio 패키지는 자바4부터 포함된 패키지로, 새로운 입출력이라는 뜻을 가지고 있다.

자바7에서는 네트워크 지원과 IO와 NIO사이의 클래스 일관성을 강화해 NIO.2 API가 추가되었다.


NIO는 IO 와 다르게 스트림이 아닌 채널 방식을 사용하며, 버퍼와 비동기 방식을 기본적으로 제공한다. 

또한, IO가 블로킹 방식만 지원하는 것과 달리 NIO는 블로킹과 넌 블로킹 방식을 모두 지원한다.



스트림 vs 채널

스트림 기반에서 입출력을 위해 입력 스트림과 출력스트림을 모두 생성해야하는 것과 달리, 

채널은 스트림과 달리 양방향으로 입출력이 가능하다.



non 버퍼 vs 버퍼


IO는 입출력을 위한 버퍼를 제공해주는 보조 스트림이 있다. NIO는 기본적으로 버퍼를 사용해 입출력을 하기 때문에 성능이 좋다.


IO가 스트림에 읽은 데이터를 즉시 처리하는 것과 달리 NIO에서는 읽은 데이터를 무조건 버퍼에 저장한다.

이는 별도로 입력된 데이터를 저장하지 않아도, 버퍼내에서 데이터의 위치를 이동해 가며 필요한 부분을 읽고 쓸 수 있는 유연성을 제공한다.



블로킹(blocking : 대기상태) vs non 블로킹

IO에서 입력 스트림의 read() 메소드를 호출하면 데이터가 입력되기 전까지 스레드가 블로킹(대기상태)가 된다. write() 메소드도 마찬가지로 출력되기전까지 블로킹 상태가 된다. 블로킹 상태에서 다른 일을 할 수 없고 이 상태를 빠져나오기 위해 인터럽트 될 수도 없다. 블로킹을 빠져나오기 위해선 스트림을 닫는 수 밖에 없다.


non 블로킹은 스레드를 인터럽트함으로써 빠져나올 수 있으며, 스레드가 블로킹 되지 않는다. 이는 입출력 준비가 완료된 채널만 선택해, 작업 스레드가 처리하기 때문에 블로킹 되지 않는다.



어떤 경우에 IO와 NIO중에서 취사 선택해야 하는가?

IO는 연결 클라이언트 수가 적고, 전송되는 데이터가 대용량으로 순차처리 될 때에 사용하는 것이 적다.


NIO는 연결 클라이언트 수가 많고, 하나의 입출력 처리 작업이 오래 걸리지 않는 경우에 사용하는 것이 좋다. 처리가 오래 걸리면 대기 작업의 수가 늘어나기 때문에 비효율적이다. 또한, 모든 입출력에 버퍼를 사용하기 때문에 대용량 데이터의 처리에는 버퍼 할당의 문제도 있다.



경로 정의 및 탐색


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
 
public class PathExample {    
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("src/sec02/exam01_path/PathExample.java");
        // or ("src/sec02/", "exam01_path/PathExample.java");
        
        System.out.println("[파일명] " + path.getFileName());
        System.out.println(("부모 디렉토리명]: " + path.getParent().getFileName()));
        
        System.out.println("중첩 경로수: " + path.getNameCount());
        
        System.out.println();
        for(int i=0; i<path.getNameCount(); i++) {
            System.out.println(path.getName(i));
        }
        
        System.out.println();
        Iterator<Path> iterator = path.iterator();
        while(iterator.hasNext()) {    // 이동할 항목이 있다면 true 리턴 
            Path temp = iterator.next();    // 현재 위치를 순차적으로 하나 증가해 이동
            System.out.println(temp.getFileName());
        }
    }
}
cs



WatchService

자바 7에서 도입된 와치 서비스는, 디렉토리 내부에서 파일 생성, 삭제, 수정 등의 변화를 감시하는데 사용된다. 

(에디터에서 파일이 변경되면 다시 불러올 것인지를 묻는 것이 와치 서비스의 예)



와치 서비스 실행 결과 및 예제 (Java FX)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
 
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
 
public class WatchServiceExample extends Application {
    class WatchServiceThread extends Thread {
        @Override
        public void run() {
            try {
                WatchService watcher = FileSystems.getDefault().newWatchService();
                Path directory = Paths.get("C:/temp");
                directory.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
                        StandardWatchEventKinds.ENTRY_DELETE,
                        StandardWatchEventKinds.ENTRY_MODIFY);                
                                
                while(true) {
                    WatchKey watchKey = watcher.take(); // 블로킹(Watch키가 큐에 들어올 때까지)
                    List <WatchEvent<?>> list = watchKey.pollEvents(); // WatchEvent목록 얻음
                    
                    for(WatchEvent<?> watchEvent : list) {
                        // 이벤트 종류 얻음
                        Kind<?> kind = watchEvent.kind();
                        // 감지된 path 얻음
                        Path path = (Path)watchEvent.context();
                        
                        if(kind == StandardWatchEventKinds.ENTRY_CREATE) {
                            Platform.runLater(()-> textArea.appendText("파일 생성됨 " + 
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
                            Platform.runLater(()-> textArea.appendText("파일 삭제됨 " +
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                            Platform.runLater(()-> textArea.appendText("파일 변경됨 " +
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.OVERFLOW) {                            
                        }
                    }
                    boolean valid = watchKey.reset();
                    
                    if(!valid) { break; }
                    }
            } catch (Exception e) { }
        }
    }
    
 
    TextArea textArea = new TextArea();
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setPrefSize(500300);
        
        textArea.setEditable(false);
        root.setCenter(textArea);
        
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("워치 서비스 예제");
        primaryStage.show();
        
        WatchServiceThread wst = new WatchServiceThread();
        wst.start();
    }
    
    public static void main(String[] args) throws Exception {
        launch(args);
    }
}
cs



non 다이렉트 버퍼와 다이렉트 버퍼


non 다이렉트 버퍼는 JVM이 관리하는 heap 메모리 공간을 이용하는 버퍼로 버퍼 생성 시간이 빠르다.  반면에 heap 공간은 상당히 제한되어 있으므로 버퍼의 크기를 크게 잡을 수가 없다. 또한 입출력을 위해 non다이렉트 버퍼의 내용을 임시 다이렉트 버퍼를 생성해 복사하고, 그곳에서 OS의 native I/O와 같은 기능을 수행하기 때문에 입출력 속도는 느리다.


반면에 다이렉트 버퍼는 OS의 native C 함수를 호출하고 여러 가지 처리할 것이 있기 때문에 버퍼 생성이 느리다. 하지만 OS가 관리하는 메모리 공간을 이용하므로 버퍼의 크기가 크고, 입출력 성능이 높다는 장점이 있다. 따라서 한 번 생성해놓고, 빈번한 입출력과 큰 데이터 처리에 사용하는 것이 효율이 좋다.



다음 예제에서는 non 다이렉트와 다이렉트 버퍼를 생성하고 그 결과를 보는 예제이다. non 다이렉트 버퍼는 앞서 설명했듯 JVM이 관리하는 제한된 heap메모리 공간을 사용하므로 크기가 작아, OutOfMemoryError가 발생한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
import java.nio.ByteBuffer;
 
public class BufferSizeExample {
 
    public static void main(String[] args) {
        ByteBuffer directBuffer = ByteBuffer.allocateDirect(200 * 1024 * 1024);
        System.out.println("다이렉트 버퍼 생성 " + directBuffer);
        
        ByteBuffer nonDirectBuffer = ByteBuffer.allocateDirect(2000 * 1024 * 1024);
        System.out.println("non 다이렉트 버퍼 생성 " + nonDirectBuffer);
    }
 
}
cs


다이렉트 버퍼 생성 java.nio.DirectByteBuffer[pos=0 lim=209715200 cap=209715200]

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory

at java.nio.Bits.reserveMemory(Bits.java:693)

at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)

at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)

at BufferSizeExample.main(BufferSizeExample.java:9)





allocate() 메소드

JVM heap 메모리에 non다이렉트 버퍼 생성.

1
2
ByteBuffer byteBuffer = ByteBuffer.allocate(100);    // 최대 100개의 바이트를 저장하는 ByteBuffer 생성
CharBuffer charBuffer = CharBuffer.allocate(100);    // 최대 100개의 문자를 저장하는 CharBuffer 생성
cs


Wrap() 메소드

각 타입별 Buffer클래스는 모두 wrap() 메소드를 가지고 있다. wrap() 메소드는 이미 생성된 자바 배열은 Wrapping해서 Buffer 객체를 생성한다.

자바 배열은 JVM heap 메모리에 생성되므로(배열도 객체이다) wrap()은 non다이렉트 버퍼를 생성한다.


1
2
byte[] byteArray = new byte[100];
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
cs


다음과 같이 배열의 일부 데이터만 Buffer객체를 생성할 수도 있다.

1
2
3
4
char[] charArray = new char[100];
 
// 0 인덱스부터 50개만 버퍼로 생성 
CharBuffer charBuffer = CharBuffer.wrap(charArray, 050);  
cs



CharBuffer는 CharSequence 인터페이스로 구현한 클래스이므로 CharSequence 타입의 매개값을 갖는 wrap() 메소드도 제공한다. 즉, 매개값으로 문자열을 제공해서 다음과 같이 CharBuffer 생성이 가능하다.


1
CharBuffer charBuffer = CharBuffer.wrap("문자열 매개값 넣기");
cs


CharSequence 인터페이스

http://impartially.tistory.com/23



allocateDirect() 메소드

이 메소드는 다이렉트 버퍼(OS가 메모리 관리)를 생성하며, ByteBuffer만 제공한다. 각 타입별 버퍼는 없지만 as-Buffer()를 통해 각 타입별 Buffer를 얻을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
 
public class DirectBufferCapacityExample {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(100);
        System.out.println("저장용량: " + byteBuffer.capacity() + " 바이트");
        
        
        CharBuffer charBuffer = ByteBuffer.allocateDirect(100).asCharBuffer();
        System.out.println("저장용량: " + charBuffer.capacity() + " 문자");
        
        IntBuffer intBuffer = ByteBuffer.allocateDirect(100).asIntBuffer();
        System.out.println("저장용량: " + intBuffer.capacity() + " 정수");
    }
}
 
cs



byte 해석 순서

1
2
3
4
5
6
7
8
import java.nio.ByteOrder;
 
public class ComputerByteOrderExample {
    public static void main(String[] args) {
        System.out.println("운영체제 종류 : " + System.getProperty("os.name"));
        System.out.println("네이티브 바이트 해석 순서 : " + ByteOrder.nativeOrder());
    }
}
cs

결과 :

운영체제 종류 : Windows 7

네이티브 바이트 해석 순서 : LITTLE_ENDIAN



CPU 등 환경에 따라 바이트의 처리 순서에는 차이가 있다. (Little Endian, Big Endian)

따라서, 네트워크로 데이터를 주고 받을 때는 하나의 Endian에 맞도록 Byte Order해줄 필요가 있다.



JVM은 무조건 Big Endian으로 자동적으로 처리해주지만, 다이렉트 버퍼일 경우 OS의 native I/O를 사용하므로 

다음과 같이 기본 해석순서로 맞춰주면 성능에 도움이 된다.


1
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(100).order(ByteOrder.nativeOrder());
cs




+ Recent posts