port forwarding(포트포워딩)
2018-11-18 00:00:00 +0000포트포워딩
- 외부에서 공유기로 ip가 할당된 서버에 접속할 수 있도록 접속port번호로 서버 ip, port번호를 매칭시키는 것
- 공유기를 통해 ip를 할당받으면 서버의 외부ip, 내부ip가 다르다
- 서버가 여러대라면 접속요청을 받아도 어느 서버에 요청한 것인지 알 수 없다
- 포트번호로 접속할 서버 ip와 port 번호를 지정해주는 것이 포트포워딩이다.
포트포워딩 방법
- cmd 창을 켜서 ipconfig 명령어를 친다. 기본 게이트 웨이 ip를 인터넷창에 친다
- 공유기 설정창이 뜨면 로그인한다 (asus)
- WAN-가상 서버/포트 포워딩 메뉴 클릭
- 유명한 서버 리스트 http를 선택
- sourcetarget은 허용 ip(없으면 모든 ip 허용)
- 포트 범위는 외부컴퓨터가 접속 요청한 포트
- 로컬 ip는 내 컴퓨터의 내부ip를 적는다
- 로컬 포트는 내부 포트 번호(나는 포트범위와 똑같이 적었다)
- 프로토콜은 웹이지만 tcp
- bitnami로 올린 아파치 server로 외부에서 접속이 잘 되는 것을 확인
서비스 이름 : HTTP Server
sourcetarget : 비워둠
포트 범위 : 80
로컬 ip : 192.168.1.11
내부 포트 번호 : 80
프로토콜 : TCP
kakao chatbot(카카오 챗봇)
2018-11-18 00:00:00 +0000Node.js란?
- V8 Engine 사용(구글에서 개발)
- 이벤트가 발생했을 때 동작하는 방식(자원 소모x)
- non-blocking
- 싱글 스레드
설치
- https://nodejs.org/ko/
- 명령 프롬프트 창을 열고 node -v 명령어를 친다. 버전이 잘 나온다면 성공
nodejs 초기화
- 새로운 폴더를 만들고 명령 프롬프트로 새로운 폴더로 이동
- npm init 명령어
- 이름, 설명, 버전 등의 정보를 작성한다 ( 전부 작성했다면 폴더에 package.json 파일이 생성되어 있다 )
- 폴더 안에 app.js 파일을 생성하고 console.log(‘hello world’); 라고 작성한다
- 명령프롬프트 창에서 node app.js 를 치면 hello world가 나오는지 확인한다
카카오 플러스친구 관리자 가입
- https://business.kakao.com/ 접속
- 상단메뉴에서 카카오 플러스친구 를 선택해서 관리자 가입을 합니다
- 새 플러스 친구를 선택해서 플러스 친구를 만듭니다
- 관리자센터-관리-상세설정에서 공개설정을 합니다
- 관리자센터-스마트채팅- 채팅유형을 선택합니다. API형 선택
- Method : GET
- URL : http(s)://your_server_url/keyboard
- Content-Type : application/json; charset=utf-8
- API Document 확인 API SPEC 메뉴를 클릭해서 API 사용 예시를 확인한다
{
"type" : "buttons",
"buttons" : ["선택 1", "선택 2", "선택 3"]
}
curl -XPOST 'https://:your_server_url/message' -d '{
"user_key": "encryptedUserKey",
"type": "text",
"content": "차량번호등록"
}
nodejs api 작업
- 명령프롬프트 창에 npm install express –save 명령어를 친다. express 프레임워크를 설치한다
- 서버 소스를 작성한다. 그리고 서버를 띄운다(명령어 node app.js)
- localhost:포트번호/keyboard 으로 접속한다
- 결과가 뜨는것을 확인할 수 있다
공인 ip 설정
- 포트포워딩 글을 참고한다( https://parkwonhui.github.io/server/2018/11/18/server-port-forwarding.html )
패킷 전달을 위한 모듈설치
- npm install body-arser –save
패킷 전달 코드 추가
- 아래 소스코드를 작성하고 http://외부 ip:포트번호/keyboard 로 접속되는지 확인한다
- 접속 완료 시 API형-앱 url에 http://외부 ip:포트번호를 적는다 (keyboard는 안적어도 된다)
- 응답이 잘 되면 성공한 것이고, 응답이 안되면 포트포워딩이나, url을 다시 확인한다
생각할 점
- 내 컴퓨터에선 80번 포트밖에 되지 않았다.
- port open 체크 사이트에서도 open 된 상황이었음( https://www.yougetsignal.com/tools/open-ports/ )
소스코드
var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.get('/keyboard', function(req, res){
console.log('get');
var data = {
'type' : 'buttons',
'buttons' : ['월','화','수','목','금']
};
res.json(data);
});
http.createServer(app).listen(80, function(){
console.log('server start');
});
app.post('/message', function(req, res){
var msg = req.body.content;
console.log('전달받은 메시지:'+msg);
var send = {}; // 응답할 데이터
switch(msg){
case '월':
send = {
'message':{
'text': '햅쌀밥\n대파육계장\n파파야함박스테이크\n닭볶음탕\n철판두부구이\n메츄리알어묵볶음\n쟁반막국수'
}
}
break;
case '화':
send = {
'message':{
'text':'햅쌀밥,참치김치찌개\n돼지고기주물럭\n생선까스/소스\n옛날짜장면\n비엔나피망볶음\n쪽파무생채'
}
}
break;
case '수':
send = {
'message':{
'text':'햄쌀밥\n스끼야끼\n수제닭강정\n파기름오징어두루치기\n한식잡채\n에그샌드위치\n숙주미나리나물\n포기김치'
}
}
break;
case '목':
send = {
'message':{
'text':'햄쌀밥\n팽이된장찌개\n등심돈까스\n매콤등뼈찜\n고구마카레\n군만두\n시금치무침'
}
}
break;
case '금':
send = {
'message':{
'text':'김치볶음밥\n모듬어묵탕\n수제케이준치킨\n제육간장불고기\n미트볼케첩조림\n조미구이김\n열무나물'
}
}
break;
default:
send = {
'message':{
'text':'알 수 없는 명령'
}
}
break;
}
res.json(send);
});
java io
2018-11-15 00:00:00 +0000스트림이란?
- 일차원적인 데이터의 흐름
- 외부의 데이터를 읽고 쓰려는 것
흐름의 방향에 따른 분류
- 입력 스트림(input stream), input은 io에 있다
- 출력 스트림(output stream)
데이터 형태에 따른 분류
- 문자 스트림(character stream), Reader/Writer
- 바이트 스트림(byte stream), input/output
FileReader 클래스
- 텍스트 파일을 읽는 클래스
- 더 이상 읽을 것이 없으면 -1을 리턴한다
- io는 무조건 예외 처리 해야한다
import java.io.FileReader;
public class FileReaderExam {
public static void main(String[] args){
FileReader reader = null;
char arr[] = new char[30];
try{
reader = new FileReader("poam.txt");
while(true){
int data = reader.read(arr);
if(-1 >= data)
break;
System.out.println(arr);
}
/* while(true){
int data = reader.read(); // 하나씩 옮기므로 비효율적이다
if(-1 == data){
break;
}
char ch = (char)data;
System.out.print(ch);
}
*/
}catch(Exception e){
e.printStackTrace();
}finally{
// close도 예외 발생할 수 있음
try{
reader.close();
}catch(Exception e2){}
}
}
FileWriter 클래스
- 텍스트를 파일에 쓰는 클래스
- 파일이 없어도 알아서 만들어준다
import java.io.FileWriter;
import java.util.Scanner;
public class FileWriteExam {
public static void main(String[] args) {
FileWriter writer = null;
Scanner sc = new Scanner(System.in);
System.out.println("입력:");
String str = "";
String poem = "";
while(!(str = sc.nextLine()).equals("q")){
poem+=str;
poem+="\n";
}
try{
writer = new FileWriter("poem2.txt");
writer.write(poem);
}catch(Exception e){
e.printStackTrace();
}finally{
try{
writer.close();
}catch(Exception e2){}
}
}
}
파일 Copy
import java.io.FileReader;
import java.io.FileWriter;
public class FileCopy {
public static void main(String[] args) {
FileReader fileRead = null;
FileWriter fileWrite = null;
String text = new String();
try{
fileRead = new FileReader("poam.txt");
while(true){
int value = fileRead.read();
if(-1 ==value)
break;
text+=(char)value;
}
// 쓰기
fileWrite = new FileWriter("poam_copy.txt");
fileWrite.write(text);
}catch(Exception e){
System.out.println(e.getMessage());
}finally {
try{
fileRead.close();
fileWrite.close();
}catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
객체를 Bytes로 변환
- nodestream : 제일 앞에 있는 스트림
- filterstream : 연결되어있는 스트림
- 객체를 데이터로 써서 txt파일로 저장하면 데이터를 재사용할 수 있다
- Seiralizable 한 class라면 직렬화 가능(오버라이딩 x)
- 클래스의 멤버객체들도 Seiralizeable 되어있어야 직렬화 가능
- ArrayList는 기본적으로 직렬화 가능하지만, 그 안의 객체도 Seiralizedable되어 있어야 가능하다
- transient키워드를 쓰면 데이터가 null로 넘어간다(숨기고 싶은 필드에 사용)
Byte Stream class
- FileInputStream : 디렉토리에 있는 파일의 내용을 직렬화 한다
- ObjectInputStream : 직렬화한 정보를 객체 타입으로 변환한다
- FileOutputStream : 파일에 바이트 내용을 입력한다(역직렬화)
- ObjectOutputStream : 파일이나 객체 정보를 바이트로 변환한다
SerialExam.java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerialExam {
Member m;
public void read(){ //파일에 있는 Member객체 역직렬화
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream("object.ser"));
m = (Member)ois.readObject(); // 파일에 직렬화 완성
} catch(Exception e){
e.printStackTrace();
}finally {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void write(){ //Member객체를 생성 파일에 직렬화
m = new Member("가가가", 20);
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("object.ser"));
oos.writeObject(m);
} catch (Exception e) {
// TODO: handle exception
}finally{
try{
oos.close();
}catch(Exception e2){
}
}
}
public static void main(String[] args) {
SerialExam se = new SerialExam();
se.write();
se.m = null;
se.read();
System.out.println(se.m);
}
}
Meber.java
package kosta.io;
import java.io.Serializable;
public class Member implements Serializable {
private String name;
private int age;
public Member(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Member [name=" + name + ", age=" + age + "]";
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
sort comparable, comparator
2018-11-15 00:00:00 +0000Comparable
- 처음 생성 시 정렬 조건을 정함
- CompareTo 함수를 오버라이딩 해서 정렬기준을 재정의한다
- -1 : 비교대상의 값이 작다
- 1 : 비교대상의 값이 크다
- 0 : 같다
SortExam.java
public class SortExam {
public static void main(String[] args) {
Random r = new Random();
TreeSet<Integer> set = new TreeSet<>(new Desending());
for(int i = 0; set.size() < 6;++i){
int num = r.nextInt(49)+1;
set.add(num);
}
System.out.println(set);
}
}
Desending.java
importjava.util.Comparator;
public class Desending implements Comparator<Integer> {
@Override
public int compare(Integer o1, Integer o2){
// 내림차순 대한 정렬기준 정의
if(o1 < o2)
return 1;
else if(o1 > o2)
return -1;
return 0;
}
}
Comparator
- 현재 정렬조건과 다른 정렬조건을 설정할 때 사용
- compare 함수를 오버라이딩해서 정렬 기준을 재정의 한다
mport java.util.ArrayList;
import java.util.Collections;
importjava.util.Comparator;
import java.util.List;
public class SortExam2 {
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person("홍자바", 50));
list.add(new Person("정자바", 80));
list.add(new Person("한자바", 40));
list.add(new Person("서자바", 100));
list.add(new Person("김자바", 20));
Collections.sort(list, new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
// 이름을 기준으로 오름차순
if(o1.getName().compareTo(o2.getName()) > 0)
return 1;
else if(o1.getName().compareTo(o2.getName()) < 0)
return -1;
return 0;
}
});
System.out.println(list);
}
}
Unresolved compilation problem
2018-11-14 00:00:00 +0000Unresolved compilation problem 에러
에러
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
at fileread.Main.main(Main.java:14)
상황
어떤 소스코드를 내 프로젝트에 포함시키고 나서 빌드하니 에러가 났다
해결
소스코드에 현재 package를 추가하지 않아서 난 에러였다
소스코드에 package 키워드로 패키지를 포함하니 해결되었다
Posts
Interceptor(인터셉터)
Android Studio Install
계층형 게시판
VirtualBox Ubuntu 18.04.2 LTS
TransactionAwareDataSourceProxy Error
Java Coding Conventions
Java Long과 long의 차이
Mybatis 객체 안에 객체 매핑
JavaConfig mariadb 연결
DataTable
관리자 페이지
MappingJackson2JsonView
Spring Javaconfig
게시판 만들기-제품 등록
게시판 만들기-제품 페이지 제작
게시판 만들기-회원탈퇴 및 게시판 삭제 플래그 추가
footer 하단에 고정시키기
bootstrap4 사용법
Spring 데이터 검증 @Valid, BindingResult
brackets 실시간 미리보기
Spring 기본설정(pom.xml, web.xml, encoding)
Vue.js computed, methods, watch
javascript onkeyup
Maria DB Incorrect string value Error
javascript 암호화(md5, base64)
Vue.js template
Vue.js 소개
Nexacro 설명
ControllerAdvice
Batch
html 페이지 로딩 순서
소수구하기(PrimeNumber)
최소공배수,최대공약수
Stream
Lambda(람다식)
inner class(내부 클래스)
final 키워드
file upload
파이썬 빅 데이터 K-평균(K-means)
아나콘다(Anaconda), 주피터 개발환경 세팅
텐서플로우(TensorFlow) 아키텍쳐 및 Session
텐서플로우(TensorFlow)상수, 변수, 함수
머신러닝 기초
한글 리스트 오름차순, 내림차순
연속된 글자의 갯수 출력
java spring5 프로젝트 설정
restController
spring 세팅 및 기본설정
mybatis trim
jquery datepicker
ajax로 데이터 전달/응답 받는법
mybatis error
mybatis 게시판 만들기 순서
Java Jsp Mybatis Dynamic Query
mybatis
git 소개
node.js 개발환경 구축
node.js 기본 내장 모듈
node.js의 전역 객체
node.js http module
node.js event
jdbc
자바빈
jsp, servlet 정리
java null object pattern
다음지도 key 등록(kakao map)
공공 데이터 open api
facebook login api
sourcetree 사용법
JavaScript event3
JavaScript jquery
JavaScript dom
JavaScript ajax
JavaScript 이벤트2
JavaScript 캡슐화
JavaScript Array,내장객체
JavaScript var
JavaScript 객체,생성자
JavaScript 함수,클로저
JavaScript Event
javascript eclipse 자동완성(with tern)
CSS position
HTML5,CSS 선택자
자바 시간 측정
git,eclipse 연동
HTML 기초 정리
Eclipse Web 환경세팅
피보나치의 수
Oracle 반복문,커서,예외,저장 서브프로그램
Oracle PL/SQL
Oracle 다중쿼리(Multiple row query)
Oracle 인덱스, 뷰, 시퀀스, 트랜잭션, 세션 정리
Oracle JOIN 정리
Oracle DDL, DML 정리
Oracle 문자열 함수 정리
Oracle 숫자,날짜,자료형 변환 함수 정리
Oracle 제약조건 정리
Oracle 기초 쿼리 정리
문제2775
DFS
junit
json
algorithmus basic
circular queue(원형큐)
binary search(이진탐색)
port forwarding(포트포워딩)
kakao chatbot(카카오 챗봇)
java io
sort comparable, comparator
Unresolved compilation problem
ArrayList, HashMap
Regular(정규표현식)
Enum Class
String Function
refactoring 이란(상수,제어플래그,assert)
reference,abstract 정리
FileNotFoundException Solve
static
Thread Synchronization(스레드동기화,원자성)
Java Exception(예외처리)
Java 생성자, this, super
roomnum
BeeHouse
Git Reset, Revert
Git Log
Array
stack
pyramid draw
Star Draw(별 그리기4)
Star Draw(별 그리기3)
Star Draw(별 그리기2)
Star Draw(별 그리기1)
Loop(While, For)
자바 데이터 타입, 데이터 연산
시계방향 달팽이 그리기
정수값의 짝수,홀수 갯수 구하기
java, Scanner 정리
draw dog
subscribe via RSS