サンプルプログラム4 (NP
JavaScript編)
C/S型の文字転送
サーバ
const port=((process.argv[2] && parseInt(process.argv[2])) || 9999)
const net=require('net')
const server=net.createServer((sock)=>{
console.log('socket created')
sock.on('data',(data)=>process.stdout.write(data.toString()))
sock.on('close',()=>console.log("closed"))
}).listen(port)
console.log(`listening on port ${port}`)
- ここでの主役は netモジュールの createServerメソッド。
- これまでに見てきたJSでのスタイルと同様に、ここでもcreateServerがコールバック関数に渡してくるsockオブジェクトに対して、さらに(onメソッドを使って)イベントハンドラを仕込む、という作り方になっている。
- なお、ここでコールバックとして渡した関数は、即座に呼ばれるのではなく、サーバソケットに対してクライアントからの接続要求が入ってきて接続が確立したタイミングで呼ばれる。
- なおcreateServerが返す値は Serverオブジェクト。これに対して
listenメソッドを呼んでいる。このメソッドは即座に呼ばれる。
- この作り方で、サーバソケットはブロックしない。なので他の言語のようにスレッドを分岐させる必要はない。
- ポート番号は整数で渡す必要がある(数値を表す文字列でも可とする言語もあるがJSでは制限あり)。
- parseIntで変換する。このためコマンドラインパラメータまたはデフォルト値を使うための式が
&&
と||
を組み合わせたやや複雑なものになっている。
クライアント
const host=(process.argv[2] || 'localhost')
const port=((process.argv[3] && parseInt(process.argv[3])) || 9999)
const net=require('net')
const sock=new net.Socket()
sock.connect(port,host,()=>{
console.log(`connected to ${host}:${port}`)
sock.write("hello I'm client\r\n")
})
process.stdin.resume();
process.stdin.on('data',(data)=>sock.write(data))
- クライアント側では net.Socketオブジェクトが主役になる。