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コード

A.javaiアプリソースコード
BusinessIM.javaServletソースコード
DatabaseAccess.javaServlet用のデータベースアクセスクラス(第6回で作成したもの)

[福野泰介, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 3/4 | 次のページ



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!