728x90
- 2015-12-13 : Embeded vert.x 관련 ref 링크 추가.
- 2014-05-23 : First posting.
%PATH%
에 "...\java\bin"
위치와 "...\vertx\bin"
위치를 넣어주고, %JAVA_HOME%=...\java
랑 %VERTX_HOME%
도 설정해주면 좋고, %CLASSPATH%
는 " (quotation mark) 없이 classpath 폴더 목록들 넣어주고. (set CLASSPATH=%CLASSPATH%;%VERTX_HOME%\conf;%VERTX_HOME%\lib\*
와 같은 명령어가 batch file에 들어있어서 따로 vertx class들의 path는 안넣어놔도 되는듯.)
설치가 잘 되었는지 확인하기 위해 cmd 창에 vertx -version
입력하면 3.0.0
와 같이 버전이 표시되어야 함. 가장 기본적인 "Hello World" 테스트는 아래와 같은 "HelloWorldServer.java"
파일을 만든 뒤,
```[.linenums.lang-java]
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpServerRequest;
import org.vertx.java.platform.Verticle;
public class HelloWorldServer extends Verticle {
@Override
public void start() {
// Using lambda expression of JAVA,
// ```
// vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() {
// public void handle(HttpServerRequest req) { req: doing something }
// }
// ```
// can become simple like this.
vertx.createHttpServer().requestHandler( (req) -> {
req.response().headers().set("Content-Type","text/html");
req.response().end("<h1>Hello World</h1>");
}).listen(1001);
}
}
```/
cmd 창에서 vertx run HelloWorldServer.java
실행 후. Browser 로 localhost:1001에 접속하면 "Hello World"가 뜸. 실행되면 Succeeded in deploying verticle
에 멈춰있는데, 하나 실행하면 다른건 못하는건가? =ㅇ=;;; 취소는 Ctrl+C
(Cancel 인듯?) 누르면, Terminate batch job (Y/N)?
가 뜨면서 취소할 수 있는듯. (단 'N'을 쳐도 취소된다는거. Ctrl+Break
로는 멈추진 않고 뭔가 장황하게 뜨기만 함.)
실제 batch 파일에서 마지막 실행은
```[.linenums]
"%JAVA_EXE%" %JVM_OPTS% %JMX_OPTS% %JAVA_OPTS% %VERTX_OPTS% %VERTX_MODULE_OPTS% -Djava.util.logging.config.file="%VERTX_JUL_CONFIG%" -Dvertx.home="%VERTX_HOME%" -Dvertx.clusterManagerFactory="%VERTX_CLUSTERMANAGERFACTORY%" -classpath "%CLASSPATH%" org.vertx.java.platform.impl.cli.Starter %CMD_LINE_ARGS%
// empty variables.
java.exe -Djava.util.logging.config.file="...\vert.x-2.1\conf\logging.properties" -Dvertx.home="...\vert.x-2.1" -Dvertx.clusterManagerFactory="org.vertx.java.spi.cluster.impl.hazelcast.HazelcastClusterManagerFactory" -classpath ".;...\jdk1.8.0_05\lib\;...\classes;...vert.x-2.1conf;...vert.x-2.1lib*" org.vertx.java.platform.impl.cli.Starter run HelloWorldServer.java
// 실제로 실행시키는 것은 "org.vertx.java.platform.impl.cli.Starter" class의 main 함수인듯. Args로 "run HelloWorldServer.java"를 전달하는 것이고. javac.exe가 아니기 때문에 compile하는게 아니고 Starter class 내부에서 "HelloWorldServer.java"를 컴파일을 해주고 실행까지 해주는 것인듯.
```/
와 같이 일어나는듯. Vert.x bin 폴더에 있는 batch 파일 열어보면 나옴.
### Encoding UTF-8
한글 출력 관련해서는 vertx.bat
파일에서
```set JVM_OPTS=-Dfile.encoding=UTF8```/
와 같이 써줘야 하는듯도... (정확한 reference를 찾아야 할텐데;;;;;; 어거지로 해결한듯한.) 보통 JAVA에서 인코딩은 컴파일 단계에서
```javac -encoding utf8 -sourcepath "%sp%" %~nx1 -d "%cp%" -classpath "%CLASSPATH%"```/
와 같이 설정해주는 것으로 알고 있었는데, 위에건 아예 실행시 설정을 바꾸는 것인듯?
```java -Dfile.encoding=UTF8 -classpath "%CLASSPATH%" file.class args```/
처럼 batch 파일에서 실행시켜 줌.
### TCP echo server
또다른 간단한 테스트 예제로 TCP telnet echo server 가 있음. 파일 "TCPechoServer.java"를 만들어 다음과 같이 저장한 뒤,
```[.linenums.lang-java]
import org.vertx.java.core.Handler;
import org.vertx.java.core.net.NetSocket;
import org.vertx.java.core.streams.Pump;
import org.vertx.java.platform.Verticle; // Every Java verticle must extend the class org.vertx.java.deploy.Verticle. You must override the start method - this is called by Vert.x when the verticle is started.
public class TCPechoServer extends Verticle{
public void start(){
// vertx.createNetServer().connectHandler(new Handler<NetSocket>(){
// public void handle(final NetSocket socket){
// Pump.createPump(socket, socket).start();
// }
// }).listen(1234);
vertx.createNetServer().connectHandler( (socket) -> {
Pump.createPump(socket, socket).start();
}).listen(1234);
}
}
```/
cmd 창에 telnet localhost 1234
를 입력하면, TThhiiss iiss eecchhoo sseerrvveerr..
와 같이 타자치는걸 그대로 베껴서 쏴주는 서버가 만들어짐. (그런데 어떻게 나가지?)
### Verticle vertx run foo.js -conf myconf.json
와 같이 실행하고 (요건 JAVA 로 작성한 코드가 아니라 javascript 로 작성한 서버코드), module 은 vertx runmod com.mycompany~my-mod~1.0 -conf myconf.json
와 같이 실행. -conf
로 configuration 을 JSON 파일로 줄 수 있음.
이렇게 설정한 configuration 은 verticle 내에서도 다음과 같은 형태로 접근 가능.
```[.linenums.lang-java]
import org.vertx.java.core.json.JsonObject;
JsonObject config = container.config();
System.out.println("Config is " + config);
```/
### Log
여러 간단한 기록을 남기고 싶을 때 쓰는. 아니면 잘 돌아가는지 테스트 할때도 쓰이고.
## Classes
org.vertx.java.platform.Verticle: A verticle is the unit of execution in the Vert.x platform.
## HTTP Server
HTTP Server 에서 데이터를 받을때 방법이 꽤나 여러가지인듯? 데이터 크기가 클 경우 중간중간 데이터들을 잘라서 처리할 수 있도록 해주려고 그런거 같은데... 대충 아래와 같은 세가지 function 이 제공됨.
Ref. - Writing HTTP Servers and Clients - Writing HTTP servers - Handling HTTP Requests - Reading Data from the Request Body : req.dataHandler
, req.endHandler
, req.bodyHandler
요렇게 세개?
데이터를 보내는 쪽에서 chunked option 을 켜놔야 (req.response().setChunked(true);
와 같은 명령어로) 받는 쪽에서도 chunked data 를 처리할 수 있음. 그러니 chunked option 같은게 안켜져 있다면 그냥 req.bodyHandler
써야함. 전체 데이터를 받은 다음 처리하는 놈.
아래는 그냥 JAVA lambda expression 이용한 예제.
```[.scrollable.lang-java]
/////////////////////////////////////////////
// Reading Data from the Request Body (Request Header is firstly handled, and Body is handled later.)
/////////////////////////////////////////////
final Buffer body = new Buffer(0);
req.dataHandler( (Buffer data) -> {
System.out.println("\nI received "+data.length()+" bytes.");
// System.out.println("data: "+data);
body.appendBuffer(data);
}); // receive each HTTP chunk of the request body.
req.endHandler( (event) -> {
System.out.println("\nHttpServerRequest including the total body is ended with body.length(): "+body.length()+" .");
// System.out.println("event: "+event); // null
System.out.println("data orginal: "+body);
try {
System.out.println(URLDecoder.decode(
("data: 한글\n"+body).replaceAll("&","\n").replaceAll("=","\t=\t")
, encoding));
} catch (Exception e) {
System.out.println(e);
}
req.response().headers().set("Content-Type","text/html; charset=utf-8");
req.response().end(
("<script>document.write( decodeURIComponent('"
+"data: 한글<br>"+body
+"') );</script>")
.replaceAll("&","<br>").replaceAll("=","\t=\t")
, encoding);
});
// req.bodyHandler( (Buffer data) -> {
// System.out.println("I received the total body of "+data.length()+" bytes.");
// }); // bodyHandler override dataHandler and endHandler???
```/
## RRA
- groups.google.com - vertx
- Vert.x.io and http://vertx.io - docs
- github.com - vert-x3
Old version :: github.com - vert-x; and the main project github.com - eclipse - vert.x - vertx-kor.otofu.me; Official homepage는 아닌가? 최신 정보를 위해서는 영어 페이지로 봅시다.
- Naver 개발자 블로그 Hello world - vert.x는 무엇이 좋은가?, 2012-10-05, by 우성민
- Daum DevOn 2012 - B3 자바기반 Vert.x로 Socket.io 서버 만들기, 2012-10-12, by 백기선 (NHN Business Platform); 영상 (42 min) 도 있음.
// Socket.io 괜찮아 보이는데 "facebook post by Keesun Baik, 2013-12-17" 에서는 "한동안 Socket.io + Vert.x로 재미를 봤었는데.. 이제 그거 그만 쓰는게 좋을것 같다. 이제는 스프링 4가 하듯이 Websocket은 전송수단으로 쓰고 STOMP라는 훌륭한 메시징 프로토콜(+구현체)을 그 위에 얹어서 쓰는게 좋겠다."라고 하시기도... - bcho.tistory.com - 비동기 네트워크 서버 프레임웍 Vert.x 소개, 2014-02-04, by 조대협
- Tech Empower.com - Web Framework Benchmarks - Round 9 (2014-05-01) - Multiple queries
// Vert.x의 성적이 그닥 성적이 좋지는 않은듯도. "Ctrl+F"로 "vert"를 검색해 보시길. 최고 대비 18.8%. (Round 8에서의 결과, 9에서는 removed.) 약간 이상하긴 함. 암튼, 이건 기본바탕이 Java니까 당연히 인터프리터가 아니라 컴파일 이후 실행되는 거겠지? - vertxproject.wordpress.com - Vert.x vs node.js simple HTTP benchmarks, 2012-05-09, by swilliamsvmw;
// Node.js와 비교해봤을때 훨씬 더 뛰어나다는 이야기. 그중 Vert.x Java를 쓰는것이 가장 성능이 좋은듯. 당연한 결과 같기도... 배우려면 vert.x Java를 배웁시다? 엄밀히는 Java에서 vert.x library를 쓰는 개념이겠지만. - kipid's blog - Learning Node.js, 2014-05-23;
// Event-driven server의 특징을 보시려면, 여기로 가보시면 될듯. Node.js를 쓰지는 않더라도 개념을 이해해놓으면 여러모로 도움이 되는듯.
Official
Introducing
Competition with other server-side languages
728x90
'[IT/Programming] > HTML related' 카테고리의 다른 글
Vertical center align by CSS in HTML (0) | 2019.04.01 |
---|---|
실시간 HTTP 양방향 통신 (Web socket, Polling, Long-polling, and so on) (0) | 2019.04.01 |
Specific event handler on HTML element? (0) | 2019.04.01 |
Number and Bit operations in JAVA and Javascript (0) | 2019.03.16 |
HTML docuK format ver. 2.1, short copiable version (2014-06-25) (0) | 2019.03.10 |
Email by JAVA (자바 프로그램을 이용해 이메일 보내기) (0) | 2019.03.10 |
여러가지 글꼴 테스트 (Font test) (0) | 2019.03.09 |