이번 스터디 내용중에 소켓통신에 대한 내용이 있어서 자료조사하다 MINA를 사용해보기로 했다.
그중에 http server를 구현할 수 있다고 해서 찾아봤는데.. 현재 MINA가 2.0.4버전까지 나왔다.
근데 2버전때에 예제에는 httpserver가 쏙 빠져있다. 구글링을 해보니 1버전에서 2버전으로 넘어오면서 httpserver가
asyncweb이라는 하나의 메뉴로 빠져버렸단다. 그게 맞는건지 어쩄든 httpserver를 돌려보기 위해
예제를 1.7을 다운받아서 예제를 돌려보았다.
예제 실행방법
1. http://mina.apache.org 에서 소스다운로드 (binary받지말고 source를 받을것)
2. 적당한 위치에서 압축해제
3. eclipse에서 import -> maven -> existing maven project -> Root Direct 를 위에 압축해제한곳으로 설정
4. example/porm.xml 만 체크후 Finish
5. 프로젝트 설정 -> Project facets -> Convert to faceted form... 파란글씨 클릭
6. OK 클릭
7. 그럼 JAVA프로젝트로 변경된걸 확인할 수 있음. 프로젝트 우클릭 -> Run as maven install
8. 필요한 예제 main 메소드 찾아서 실행.
이제 httpserver 예제를 실행해볼건데 org.apache.mina.example.httpserver 에 가보면 codec 과 stream이라는 패키지가 있다.
stream은 단순히 html을 리턴하는 서버라 생각하면 되고, 파라미터등의 처리를 위해 codec 코드를 본다.
그중에서 Server.java를 실행시켜보자. 그럼 콘솔창에 아래와 같이 뜬다.
Server now listening on port 8090
private Map parseRequest(Reader is) { Mapmap = new HashMap (); BufferedReader rdr = new BufferedReader(is); try { // Get request URL. String line = rdr.readLine(); String[] url = line.split(" "); if (url.length < 3) return map; map.put("URI", new String[] { line }); map.put("Method", new String[] { url[0].toUpperCase() }); map.put("Context", new String[] { url[1].substring(1) }); map.put("Protocol", new String[] { url[2] }); // Read header while ((line = rdr.readLine()) != null && line.length() > 0) { String[] tokens = line.split(": "); map.put(tokens[0], new String[] { tokens[1] }); } // If method 'POST' then read Content-Length worth of data if (url[0].equalsIgnoreCase("POST")) { int len = Integer.parseInt(map.get("Content-Length")[0]); char[] buf = new char[len]; if (rdr.read(buf) == len) { line = String.copyValueOf(buf); } } else if (url[0].equalsIgnoreCase("GET")) { int idx = url[1].indexOf('?'); if (idx != -1) { map.put("Context", new String[] { url[1].substring(1, idx) }); line = url[1].substring(idx + 1); } else { line = null; } } if (line != null) { String[] match = line.split("\\&"); for (int i = 0; i < match.length; i++) { String[] params = new String[1]; String[] tokens = match[i].split("="); switch (tokens.length) { case 0: map.put("@".concat(match[i]), new String[] {}); break; case 1: map.put("@".concat(tokens[0]), new String[] {}); break; default: String name = "@".concat(tokens[0]); if (map.containsKey(name)) { params = map.get(name); String[] tmp = new String[params.length + 1]; for (int j = 0; j < params.length; j++) tmp[j] = params[j]; params = null; params = tmp; } params[params.length - 1] = tokens[1].trim(); // 넘겨받은 파라미터를 찾아 따로 처리. // 이렇게 하는게 맞는지는 확실히 모르겠음. if( name.equals("@val")){ String xmlStr = URLDecoder.decode(params[0],"UTF-8"); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder builder = factory.newDocumentBuilder(); InputSource iss = new InputSource( new StringReader( xmlStr ) ); Document doc = builder.parse( iss ); NodeList nodelist = doc.getElementsByTagName("test"); for (int j = 0; j < nodelist.getLength(); j++) { NodeList nodeChild = nodelist.item(j).getChildNodes(); System.out.println(nodeChild.item(0).getTextContent()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }// end if map.put(name, params); } } } } catch (IOException ex) { ex.printStackTrace(); } return map; }
'개발' 카테고리의 다른 글
[Mybatis/Ibatis] procedure call 후 Cursor를 hashMap으로 결과 받기 (0) | 2012.10.14 |
---|---|
[에러/해결] javascript translation for intentionally not implemented (0) | 2012.10.11 |
[Spring3.0] 스프링 IoC의 용어정리 (0) | 2012.03.26 |
[spring/TIP] Eclipse에서 maven을 이용하여 Spring MVC 기본환경 구축하기 (0) | 2012.03.09 |
[Spring] 스프링에서 사용되는 웹 프레임워크의 종류 (0) | 2011.12.24 |