앱엔진 짱이네요-_-
속도만 빨랐다면 호스팅을 여기로 옮겨도 뭐 문제가 없을 듯. 시스템적으로는 구글이 다 관리해주고, 개발환경도 매우 편하니...(하지만, DB 접근이 방식이 틀려서 힘든면도 있지만ㅠ)
pc랑 android랑 뭔가 싱크맺는 뭐 그런거 만드려다보니 여기까지 와버렸네요-_- 이걸 통해서 하면 좋을 것 같아서^^
암튼, Channel API를 제공하는데, 원하는 채널을 생성해서 그곳 페이지로 접속한 사용자들끼리 메세지를 주고 받을 수 있게 됩니다.
앱엔진 채널부분 문서입니다.
보면 JavaAPI랑 JavascriptAPI 두개 있는데, 클래스도 몇 개 없습니다.
Java에서는 ChannelService를 가져와서 createChannel로 채널을 만든 뒤에, sendMessage함수로 메세지만 보내면 됩니다.
Javascript에서는 goog.appengine.Channel이라는 클래스가 존재하는데, 이걸로 오픈하고 메세지 받으면 됩니다.
일단..... 나중에 쓰려고 만든거다보니 Spring3.0과 jQuery가 들어갔네요-_-
http://mudchobo.tistory.com/470 이거 참조해서 환경 구축을 하면 됩니다~^^
ChannelController.java
package com.mudchobo.apps.exchangepp.controller;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.google.appengine.api.channel.ChannelMessage;
import com.google.appengine.api.channel.ChannelService;
import com.google.appengine.api.channel.ChannelServiceFactory;
@Controller
@RequestMapping("/channeltest")
public class ChannelController {
private String channelName = "test";
@RequestMapping(value="/test", method=RequestMethod.GET)
public String test(Model model){
ChannelService channelService = ChannelServiceFactory.getChannelService();
String token = channelService.createChannel(channelName);
model.addAttribute("token", token);
return "test";
}
@RequestMapping(value="/open", method=RequestMethod.POST)
@ResponseBody
public String openChat(){
ChannelService channelService = ChannelServiceFactory.getChannelService();
channelService.sendMessage(new ChannelMessage(channelName, "open"));
return "";
}
@RequestMapping(value="/send", method=RequestMethod.POST)
@ResponseBody
public String sendChat(@RequestParam("msg") String msg){
System.out.println("message = " + msg);
try {
ChannelService channelService = ChannelServiceFactory.getChannelService();
channelService.sendMessage(new ChannelMessage(channelName, URLEncoder.encode(msg, "UTF-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
}
최초 접속페이지는 /test 입니다.
여기서 채널을 생성해줍니다. 이 생성해서 나온 토큰을 client로 전달합니다. 그러면 그 client에서 goog.appengine.Channel("토큰값");을 통해 Channel을 생성합니다. 그러면 커넥션을 맺고 있게 되는겁니다.
클라이언트부분
test.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>
<!doctype html>
<html>
<head>
<script src="/_ah/channel/jsapi"></script>
<script src="/js/lib/jquery-1.4.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
var sendMessage = function(path, msg){
var xhr = new XMLHttpRequest();
xhr.open("POST", "/apps/channeltest/" + path + "?msg=" + encodeURIComponent(msg), true);
xhr.send();
}
var onOpen = function(){
sendMessage("open");
};
var onMessage = function(m){
var msg = decodeURIComponent(m.data.split("+").join(" "));
$("#message_box ul").append("<li>" + msg + "</li>");
$("#message_box").scrollTop(999999999);
};
var onError = function(){
alert("error");
};
var onClose = function(){
alert("close");
};
$(document).ready(function(){
var channel = new goog.appengine.Channel("${token}");
var socket = channel.open();
socket.onopen = onOpen;
socket.onmessage = onMessage;
socket.onerror = onError;
socket.onclose = onClose;
$("#send_btn").click(function(){
sendMessage("send", $("#message").val());
$("#message").val("");
});
$("#message").keyup(function(e){
if (e.keyCode == 13){
sendMessage("send", $("#message").val());
$("#message").val("");
}
});
});
</script>
</head>
<body>
<div id="message_box" style="width:500px;height:300px;overflow:scroll;font-size:12px">
<ul></ul>
</div>
<input type="text" id="message" name="message" />
<input type="button" value="보내기" id="send_btn" name="send_btn" /><br />
</body>
</html>
일단 Channel클래스를 쓰려면 <script src="/_ah/channel/jsapi"></script>를 include해야해요. 그리고, new goog.appengine.Channel생성부분을 유심히 보면 함수로 onopen, onmessage, onerror, onclose를 등록할 수 있어요. 메세지를 받으면 onmessage가 호출이 되니 여기서 처리하면 됨 ㅇㅇ 보내는 것은 아까 java에서 만들어 놓은 url을 호출하면 됨. 끗~
예제주소는 여기
소스파일...귀찮아서 그냥....통째로.....-_-
ps. 한글이 깨지길래 보낼 때 인코딩하고, 다시 받을 때 url인코딩해서 보내고 받은 걸 푸는 방식으로 했더니 되네요.
mudchobo.zip
package com.mudchobo.sosischedule.service;
invalid-file
