StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

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 +0000

Node.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 +0000

Comparable

  • 처음 생성 시 정렬 조건을 정함
  • 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 +0000

Unresolved compilation problem 에러

에러

Exception in thread "main" java.lang.Error: Unresolved  compilation problem:
     at fileread.Main.main(Main.java:14)

상황

어떤 소스코드를 내 프로젝트에 포함시키고 나서 빌드하니 에러가 났다

해결

소스코드에 현재 package를 추가하지 않아서 난 에러였다
소스코드에 package 키워드로 패키지를 포함하니 해결되었다

Posts

subscribe via RSS