Socket.io を使う

(プログラミングの過程を順を追って) 構成図

前準備

  1. node.js が使える状態にしておく
    (プロキシの設定も)

     npm config set proxy http://proxy:3128/
    
  2. フォルダを作る(アプリケーションフォルダ)
  3. コマンドプロンプトを開く
  4. エディタを開いておく(あとで必要な時に開くのでも可)
  5. ブラウザも開いておこう(同上)

  6. npmの初期設定

     npm init
    
  7. ソースファイル index.js を作る
    (名前は何でもいいが package.jsonにその名前を書いてしまったので)

Webサーバの骨組み:JSによるコード(1)

require('express')
require('http')
// こういう形で ライブラリをアプリケーションに組み込む

読み込んだライブラリ(が返すオブジェクト)を後で使えるように

// requireが返すオブジェクトを変数として名前をつける
var exxpress=require('express')
var http=require('http')

2つのオブジェクトの関係を認識しよう

var express=require('express')
var app=express()
var http=require('http')
var server=http.Server(app)

要求処理をするコード(の一部)と、 接続待ちのためのコード

app.get('/', function(req, res){
  res.send('<h1>Hello world</h1>');
});
server.listen(3000, function(){
  console.log('listening on *:3000');
});

または、ES6(ECMAScript2015以降)の文法で

app.get('/', (req, res)=>{
  res.send('<h1>Hello world</h1>')
})
server.listen(3000, ()=>{
  console.log('listening on *:3000')
})

動かしてみる

node index
起動の省力化

トップページ

socket.io の組み込み

一人チャット

  1. ページ上での入出力フィールド(index.jadeへの追加

     #messages
     .input
       input#m
       button#b 送信
    
  2. CSSによる修飾(style.cssへの追加)の一例

     .input { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
     input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
     button { padding: 3px; width: 5%;  }
     #messages { list-style-type: none}
     #messages li:nth-child(odd) { background: #eee; }
    
  3. クライアント側のコード(chat.jsに挿入)

     $('#b').click(()=>{
       console.log("sub")
     	  socket.emit('chat message', $('#m').val())
       $('#m').val('')
       return false
     })
     socket.on('chat message', (msg)=>{
       $('#messages').append($('<li>').text(msg))
     })
    
  4. サーバ側のコード
    ( io.on のブロックの中に記述する)

     ...
       sock.on('chat message',(msg)=>{
         console.log(msg)
         var time=new Date().toFormat("HH24:MI:SS")
         sock.emit('chat message',time+'=>'+msg)
       })
     })
    

フォルダ構成 ここまでのところで、フォルダ構成としては右図のようになるだろう。 (リンク先のファイルは、サンプルとして用意したもの; 前述のコードと若干違う部分もある)