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