開発メモ

Webアプリ(Java, JS, CSS, HTML)や、ゲーム(Unity, C#)のことなどを書いてます。

WebSocket:エコーアプリのUI開発

前回 に引き続き、WebSocket のエコーアプリ(サーバサイドは Java)を作っていきます。今回は UI の開発なので、HTML, JavaScript, CSS で実装していきます。

※ HTML や JavaScript のファイルは、前回作成したプロジェクト(ディレクトリ階層)に保存します。必要に応じて 前回の記事 を参照して頂けると嬉しいです。

画面イメージ

今回作成する画面のイメージは、動作確認の記事 に掲載しています。

1. HTML

HTML で、文字列を送信する領域と表示する領域を書いていきます。

ws-echo/src/main/webapp/index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>WebSocket Echo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="main.css" />
</head>
<body>
<div id="main">
  <div id="in">
    <div id="form">
      <div><textarea id="txt"></textarea></div>
      <div><input type="button" id="send" value="送信"></div>
    </div>
  </div>
  <div id="out"></div>
</div>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="main.js"></script>
</body>
</html>

JavaScriptjQuerymain.js を読み込むようにしてて、CSSmain.css で定義するようにしてます。

2. JavaScript

jQuery と WebSocket の API を使って、サーバーに文字列を送信したり、サーバーエコーを表示する処理を実装しています。

ws-echo/src/main/webapp/main.js

$( document ).ready(function() {
  //-> websocket
  var ws = new WebSocket("ws://localhost:8080/ws-echo/echo");
  ws.onopen = function(event) {
    console.log("@onopen");
  };
  ws.onmessage = function(event) {
    console.log("@onmessage");
    console.log(event.data);
    $('#out').prepend(
      '<div class="echo"><p>' +
      event.data + '</div>'
    );
  };
  ws.onclose = function(event) {
    console.log("@onclose");
    alert(
      'サーバーとの接続が切れました。\n' +
      'ページのリロードで再接続します。'
    );
  };
  //-> event
  var $textarea = $('#txt');
  $('#send').on('click', function(e) {
    var txt = $textarea.val();
    ws.send(txt);
    $textarea.val('');
  });
});

ページ(index.html)が開かれたら、サーバーと WebSocket の接続をするようにしています。接続後に何もしないと接続が切れるみたいだったので、その際にアラートを表示するようにしてます。

3. CSS

サンプルなので必要ないかもしれませんが、少し見やすくなる?スタイルシートを作成してみました。

ws-echo/src/main/webapp/main.css

body {
  font-size: 16px;
  font-family: sans-serif;
  background-color: #f5f5f5;
}
#main {
  width: 90%;
  margin: 0 auto;
  max-width: 500px;
}
#form {
  text-align: center;
  padding: 20px;
  background-color: #ffffff;
  border: 1px solid #bbb;
  border-radius: 5px;
}
#form #txt {
  width: 100%;
  margin-top: 10px;
  margin-bottom: 10px;
}
#out {
  margin-top: 50px;
}
#out .echo {  
  padding: 10px 20px;
  margin-top: 10px;
  background-color: #ffffff;
  border: 1px solid #bbb;
  border-radius: 5px;
}
#out .echo p {
  white-space: pre-wrap;
  word-wrap: break-word;
}

次回

次回以降は、作成したアプリをサーブレットコンテナに配備して動かします。組込みJetty で動かす記事と、Tomcat に war を配備して動かす記事を用意しています。