Help us understand the problem. What is going on with this article?

JavaScriptでWebSocket通信をしてみた

概要

WebSocketとは、HTTPベースでクライアント、サーバー相互通信を実現する技術です

前回実施したC#でWebSocketでサーバーからクライアントへの通知をするサンプルに対し
クライアント側はWebブラウザで実施されることがほとんどと思われるため
JavaScriptでクライアント側を作成し、前回作成したC#のサーバー間で通信させてみました。

前回記事
C#でWebSocketのサンプルを動かしてみた

クライアント側のJavaScriptでは大まかに以下の手順で通信を実施します

1.WebSocketの接続を確立する
サーバー側のURLを引数に渡し、接続を確立する

var connection = new WebSocket(サーバーURL);

2.サーバー側からの通知を受信する
リスナを定義し、サーバーからの通知を受け取る

connection.onmessage = function(event) {
    //event.data でサーバーからの通知を受信 
};

webSocket通信を試してみた

上記の説明どうり、JavaScriptでWebSocketの接続を確立後、サーバーからの通知を受信するリスナを定義し、サーバからの通知をを画面に表示するようにしました。
サーバーは前回のC#サンプルをそのまま使用しています。

クライアント側の実装(JavaScript)

webSocketTest.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <p>WebSocketサンプル</p>
    <input id="eventType">
    <input id="dispMsg">
  </body>
</html>

<script type="text/javascript">

    //WebSocket接続
    var connection = new WebSocket("ws://localhost:8000/ws/");

    //接続通知
    connection.onopen = function(event) {
        document.getElementById( "eventType" ).value = "通信接続イベント受信";
        document.getElementById( "dispMsg" ).value = event.data;
    };

    //エラー発生
    connection.onerror = function(error) {
        document.getElementById( "eventType" ).value = "エラー発生イベント受信";
        document.getElementById( "dispMsg" ).value = error.data;
    };

    //メッセージ受信
    connection.onmessage = function(event) {
        document.getElementById( "eventType" ).value = "メッセージ受信";
        document.getElementById( "dispMsg" ).value = event.data;
    };

    //切断
    connection.onclose = function() {
        document.getElementById( "eventType" ).value = "通信切断イベント受信";
        document.getElementById( "dispMsg" ).value = "";
    };
</script>

サーバ側の実装(C#)

前回の記事と同様の処理です、参考までに掲載しています

serverTest.cs
static async Task Run()
{
    //Httpリスナーを立ち上げ、クライアントからの接続を待つ
    HttpListener s = new HttpListener();
    s.Prefixes.Add("http://localhost:8000/ws/");
    s.Start();
    var hc = await s.GetContextAsync();

    //クライアントからのリクエストがWebSocketでない場合は処理を中断
    if (!hc.Request.IsWebSocketRequest)
    {
        //クライアント側にエラー(400)を返却し接続を閉じる
        hc.Response.StatusCode = 400;
        hc.Response.Close();
        return;
    }

    //WebSocketでレスポンスを返却
    var wsc = await hc.AcceptWebSocketAsync(null);
    var ws = wsc.WebSocket;

    //10回のレスポンスを返却
    for (int i = 0; i != 10; ++i)
    {
        //1回のレスポンスごとに2秒のウエイトを設定
        await Task.Delay(2000);

        //レスポンスのテストメッセージとして、現在時刻の文字列を取得
        var time = DateTime.Now.ToLongTimeString();

        //文字列をByte型に変換
        var buffer = Encoding.UTF8.GetBytes(time);
        var segment = new ArraySegment<byte>(buffer);

        //クライアント側に文字列を送信
        await ws.SendAsync(segment, WebSocketMessageType.Text,
          true, CancellationToken.None);
    }

    //接続を閉じる
    await ws.CloseAsync(WebSocketCloseStatus.NormalClosure,
      "Done", CancellationToken.None);
}

実行してみる

上記ができたら、サーバを事前に動かしておき、Webブラウザで上記クライアント側となるJavaScript付きのHTMLを実行すると、サーバへ要求がなされます。
成功すると、以下のようにサーバ側の現在時刻が2秒間隔でWebブラウザに表示されます。

image.png

以上

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away