Mobile:NEWS |
2002年9月27日 01:33 AM 更新
|
ビジネスiアプリ入門(7)
待ち受けビジネスIMのサーバ(Servlet)と通信部の作成(3/4)
前のページ
これを処理するServletは以下のようになり、初回登録の通信コードが完成します。このコードにおいて、Servletは受け取ったパラメータを1byteずつ分割した形にするため、日本語文字列に変換するためのdecodeメソッドを作成します。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
public class BusinessIM extends HttpServlet {
public void doGet(
HttpServletRequest request, HttpServletResponse response
) throws IOException, ServletException {
String path = request.getPathInfo();
DatabaseAccess da = new DatabaseAccess();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// それぞれの処理
if (path.equals("/sendInit")) {
sendInit(baos, request, da); // 初回登録
}
byte[] res = baos.toByteArray();
response.setContentType("application/octet-stream");
response.setContentLength(res.length);
OutputStream os = response.getOutputStream();
os.write(res);
os.close();
}
// ------------------------------------------------------------------
static String decode(String s) throws IOException {
return new String(s.getBytes("ISO8859_1"), "SJIS");
}
// ------------------------------------------------------------------
void sendInit(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
String name = decode(req.getParameter("name"));
boolean res = false;
if (name != null && name.length() > 0) {
res = da.registUser(name);
}
os.write(res ? 1 : 0);
}
}
このようにほかのメソッドについても同様に、プロトコルに沿って実装します。
Message[] update(Data data) { // 定期的に
try {
InputStream is = http("update", new String[] { "name", data.myname });
// メンバー状態の取得
int nmember = is.read();
data.member.removeAllElements();
for (int i = 0; i < nmember; i++) {
String name = readString(is);
String state = readString(is);
Member member = new Member(name, state);
data.member.addElement(member);
}
// メッセージの取得
int nmes = is.read();
Message[] message = new Message[nmes];
for (int i = 0; i < nmes; i++) {
String name = readString(is);
String mes = readString(is);
message[i] = new Message(name, mes);
}
return message;
} catch (Exception e) {
e.printStackTrace();
}
return new Message[0];
}
void sendState(String myname, String state) {
try {
http("sendState", new String[] { "name", myname, "state", state });
} catch (Exception e) {
e.printStackTrace();
}
}
void sendMessage(String myname, String toname, String mes) {
try {
http("sendMessage", new String[] { "myname", myname, "toname", toname, "mes", mes });
} catch (Exception e) {
e.printStackTrace();
}
}
iアプリコード
static void writeString(OutputStream os, String s) throws IOException {
byte[] b = s.getBytes("SJIS");
os.write(b.length);
os.write(b);
}
void update(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
String name = decode(req.getParameter("name"));
String[][] state = da.getUserState();
String[][] mes = da.getUserMessage(name);
// メンバーの状態送信
os.write(state.length);
for (int i = 0; i < state.length; i++) {
writeString(os, state[i][0]);
writeString(os, state[i][1]);
}
// メッセージ送信
os.write(mes.length);
for (int i = 0; i < mes.length; i++) {
writeString(os, mes[i][0]);
writeString(os, mes[i][1]);
}
}
void sendState(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
String name = decode(req.getParameter("name"));
String state = decode(req.getParameter("state"));
da.changeUserState(name, state);
}
void sendMessage(OutputStream os, ServletRequest req, DatabaseAccess da) throws IOException {
String myname = decode(req.getParameter("myname"));
String toname = decode(req.getParameter("toname"));
String mes = decode(req.getParameter("mes"));
da.registMessage(myname, toname, mes);
}
Servletコード
[福野泰介, ITmedia]
Copyright © ITmedia, Inc. All Rights Reserved.
前のページ
| 3/4 | 次のページ