サンプル
サンプル サーバー側(Jetty 8による実装)
このサンプルを試すにはサーバー側とクライアント側の準備が必要です。
サーバー側は、Javaサーブレットの実行環境である、Jettyを用います。
サンプルを動かす手順は、基本的にはHTTPサーブレットと同じです。
まず、サンプルのJavaファイルをコンパイルしたクラスファイルを作ります。
コンパイルするには、「jetty-websocket-バージョン番号.jar」と「servlet-api-バージョン番号.jar」を参照する必要があります。
バージョン番号はJettyに添付されているファイルのバージョンに読み替えてください。Jetty自体は基本的に8.0以上が必要です。
package wsapp;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.ConcurrentLinkedQueue;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.websocket.*;
// 接続リクエストとWebSocket通信の仲立ちを行うサーブレット
public class MyServlet extends WebSocketServlet{
// クライアントとの接続を管理するリスト
private static ConcurrentLinkedQueue<MySocket> sSocketQueue =
new ConcurrentLinkedQueue<MySocket>();
// 接続リクエストを受けたとき、WebSocket通信を処理するWebSocketインターフェイス実装クラスを返す
@Override
public WebSocket doWebSocketConnect(HttpServletRequest request, String protocol) {
return new MySocket();
}
// WebSocket通信を処理するWebSocketインターフェイス実装クラス
class MySocket
implements WebSocket.OnTextMessage{
// このインスタンスが処理する、クライアントとの接続
private Connection mConnection;
// WebSocket通信開始時のコールバック関数
@Override
public void onOpen(Connection connection){
this.mConnection = connection;
// 開始された接続をリストに追加
sSocketQueue.add(this);
}
// WebSocket通信切断時のコールバック関数
@Override
public void onClose(int closeCode , String message){
// 切断された接続をリストから削除
sSocketQueue.remove(this);
}
// テキストメッセージ受信時のコールバック関数
@Override
public void onMessage(String data){
// リストの中のすべての接続に、受信したデータを再配信
for(MySocket socket : sSocketQueue){
try{
socket.mConnection.sendMessage(data);
} catch (IOException e) {
// エラーになった接続をリストから削除
sSocketQueue.remove(socket);
e.printStackTrace();
}
}
}
}
}
そして、Jettyのインストールフォルダの下の「webapps/wsapp/WEB-INF/classes/wsapp」ディレクトリに、先ほどのクラスファイルを配置します。さらに、「webapps/wsapp/WEB-INF/」ディレクトリに以下のようなweb.xmlファイルを配置します。
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
metadata-complete="false"
version="3.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>wsapp.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
また、設定によっては「webapps/wsapp/WEB-INF/lib」ディレクトリにコンパイル時に参照したものと同じバージョンの「jetty-websocket-バージョン番号.jar」を配置する必要もあります。
この状態でJettyインストールディレクトリ直下で「java -jar start.jar」コマンドを実行すると、Jettyサーバーが起動し、サーブレットが実行可能な状態になります。
サンプル クライアント側
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>サンプル 簡単なチャットアプリケーション</title>
</head>
<body>
同じサーバーと接続しているクライアントの間でチャットができます。
<hr>
<p>受信メッセージ表示領域</p>
<ul id="received">
</ul>
<hr>
<input id="message" type="text">
<input type="button" value="メッセージ送信" onclick="onSend()">
<script type="text/javascript">
const url = "ws://localhost:8080/wsapp/MyServlet";
var received = document.getElementById("received");
var message = document.getElementById("message");
var ws;
// FireFoxとの互換性を考慮してインスタンス化
if ("WebSocket" in window) {
ws = new WebSocket(url);
} else if ("MozWebSocket" in window) {
ws = new MozWebSocket(url);
}
// メッセージ受信時のコールバック関数
ws.onmessage = function(event){
console.log("受信メッセージ:" + event.data);
var li = document.createElement("li");
li.innerHTML = event.data;
received.appendChild(li);
}
// メッセージ送信
function onSend(){
ws.send(message.value);
console.log("送信メッセージ:" + message.value);
}
// 終了時に明示的に接続を閉じる
window.onunload = function(){
var code = 4500;
var reason = "クライアントが閉じられました。";
ws.close(code,reason);
}
</script>
</body>
</html>
関連項目
(関連する項目はありません)