Node.jsでTCPサーバー・クライアントを作る

Javascript

Node.jsで簡単なTCPサーバーを作ってみました。
net.createServer()でサーバーインスタンスを生成し、コネクション確立/切断・データ受信・エラー等のイベントハンドラーを記述することになります。

  • TCPサーバー
 var net = require('net');
 var HOST = '127.0.0.1';
 var PORT = 3000;
 // サーバーインスタンスを生成し、リッスンします
 // net.createServer()に渡す関数は、'connection'イベントハンドラーになります。
 // コールバック関数が受け取るsockeオブジェクトは各接続ごとにユニークなものとなります。
 net.createServer(function(sock) {
     // TCPサーバーが接続しました。socketオブジェクトが自動的に割り当てられます。
     console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort);
     // 'data' イベントハンドラー
     sock.on('data', function(data) {
         console.log('DATA: ' + data );
         // ソケットに応答を書き込みます。クライアントはその書き込みを受信します。
         sock.write('RECIEVED');
     });
     // 'close'イベントハンドラー
     sock.on('close', function(had_error) {
         console.log('CLOSED. Had Error: ' + had_error);
     });
     // 'errer'イベントハンドラー
     sock.on('error', function(err) {
         console.log('ERROR: ' + err.stack);
     });
 }).listen(PORT, HOST);
 console.log('Server listening on ' + HOST +':'+ PORT);
  • TCPクライアント
 var net = require('net');
 var HOST = '127.0.0.1';
 var PORT = 3000;
 var client = new net.Socket();
 client.connect(PORT, HOST, function() {
     console.log('CONNECTED TO: ' + HOST + ':' + PORT);
     // クライアントが接続次第、ソケットにメッセージを書き込みます。サーバーはこのデータを受信します。 
     client.write('HELLO WORLD!');
 });
 // クライアント側ソケットの'data'イベントハンドラーを定義します。
 // dataはサーバーがこのソケットに送信した内容になります。
 client.on('data', function(data) {
     console.log('DATA: ' + data);
     // Close the client socket completely
     client.destroy();
 });
 // クライアント側'close' イベントハンドラーを定義します
 client.on('close', function() {
     console.log('Connection closed');
 });

Node.js MySQLに接続して結果を表示するサンプルコード

Javascript
node.js

さて、node.jsを約7年ぶりぐらいに触る私です。
いまや、押しも押されぬプラットフォームに成長したnode.js。。。
温かい目で見守ってきた甲斐があります!

とはいえ、どうやって書くのかほとんど忘れちゃったので、リハビリがてら、とっても簡単なことから勉強でやっていきます。

私はWindowsで開発しているので、別でnode.js Windowsでの開発の仕方もついでに参考にしてください。

 var connection = mysql.createConnection({
 	  host     : 'localhost',
 	  user     : 'hogehoge',
 	  password : 'hogedayo',
 	  database : 'hoge'
 	});
 
 connection.connect(function(err) {
 	  if (err) {
 	    console.error('error connecting: ' + err.stack);
 	    return;
 	  }
 
 	  console.log('connected as id ' + connection.threadId);
 	});
 
 
 connection.query('SELECT * FROM `addresses` WHERE `id` = 1', function (error, results, fields) {
 	
 	if (error) throw err;
 	console.log('result: ' + results[0].address);
 
 })

Node.js + Express 超初めの一歩

Javascript
node.js

Node.jsのフレームワークもいろいろありますが、とりあえず、Expressを使ってみます。(これを書いている時点2017年4月4日時点で4.15.2です。)

まずは、前にも書きましたが、私の開発環境はWindowsなので、コマンドプロンプトから

 npm install express

とやります。

下記みたいな感じですね。

express-install.png

Express公式サイトにもある簡単な例ではありますが

 var express = require('express');
 var app = express();
 
 app.get('/', function (req, res) {
 	  res.send('Hello World!');
 	});
 
 app.listen(3000, function () {
 	  console.log('Example app listening on port 3000!');
 });

と書いて、expressTest.jsという名前で保存します。

 node expressTest.js

とやります。
下記のようになりますね!

express-hello.png

んで、

 http://localhost:3000/

に接続すると、

 Hello World!

と表示されます。

もうちょっとだけやります。
GETパラメーターを受け取ってみましょう!
下記のようにやります。

 var express = require('express');
 var app = express();
 
 app.get('/', function (req, res) {
 	
 	 var p1 = req.query.p1;
 	  res.send(p1);
 
 });
 
 app.listen(3000, function () {
 	  console.log('Example app listening on port 3000!');
 });
 node expressTest.js

を再度実行し、再起動します。

 http://localhost:3000/?p1=1234

にアクセスすると、1234と表示されたはずです[smile]

Nginx サブディレクリのアクセスをsocket.ioに転送する

Linuxサーバー

Nginxでサブディレクリへのアクセスをsocket.ioに転送する方法を調査しました。
サブディレクトリで転送する場合は、socket.ioのアプリ側で対応が必要になります。

以下はsocket.ioはNginxと同一サーバー、ポート3000番で動作させる例です。
Nginxはバージョン1.3.13以上です。このバージョンから単体でwebsocketに対応するようになりました。
socket.ioに転送するURLは下記の通りです。
http://example.com/node/

Nginxの設定ファイル

/node/へのアクセスをバックエンドsocket.ioのURLに転送します。

 upstream backend {
    server 127.0.0.1:3000;
 }
 
 server {
  
     # 省略
 
     location /node/ {
         proxy_pass http://backend/;
         proxy_http_version 1.1;
         proxy_set_header Upgrade $http_upgrade;
         proxy_set_header Connection "upgrade";
         proxy_redirect off;
     }
 }

socket.ioのサンプルコード

app.js

ルートで動作させる場合と違いはありません。

 var http = require('http'),
     fs = require('fs'),
     // NEVER use a Sync function except at start-up!
     index = fs.readFileSync(__dirname + '/index.html');
 
 // Send index.html to all requests
 var app = http.createServer(function(req, res) {
     res.writeHead(200, {'Content-Type': 'text/html'});
     res.end(index);
 });
 
 // Socket.io server listens to our app
 var io = require('socket.io').listen(app);
 
 // Send current time to all connected clients
 function sendTime() {
     io.sockets.emit('time', { time: new Date().toJSON() });
 }
 
 // Send current time every 10 secs
 setInterval(sendTime, 10000);
 
 // Emit welcome message on connection
 io.sockets.on('connection', function(socket) {
     socket.emit('welcome', { message: 'Welcome!' });
     socket.on('i am client', console.log);
 });
 
 app.listen(3000);
                  

index.html

Nexus4をDocomoのSIMカードで使う

Android

Nexus4をDocomoのSIMカードで使う 写真つき

Googleの出しているNexus4が、SIMフリー端末として、いい感じです。
DocomoのSIMカードで使うのに、ちょっとひと手間あったので、メモしておきます。

いつも使っているGalaxyからSIMカードをひっこぬいて、Nexus4に入れます。
sim_to_nexus4.png

それだけで使えるかなーと思っていたら、使えなかったので、下記のサイトさんで紹介されているように、アクセスポイント名をmopera.netにしてみてもだめでした。。。

http://androidlover.net/smartphone/nexus4/sim-free-device-docomo-apn.html

で、ドコモさんの公式サイトを見たところ、Docomoショップに来て手続きするように的なことが書いてあったので、とりあえず行ってみます。

http://www.nttdocomo.co.jp/support/procedure/simcard/other/

待たされること30分…

カウンターのお姉さんに、
「moperaの契約が必要です。月額500円ぐらいなんですが、申し込みますか?」
と言われました。
あ、mopera って別途契約しないといけないんだ?!
ま、とりあえず契約しました。

moperaってなんだ?
と思い、moperaさんの公式サイトを見ますと
http://www.mopera.net/service/about/whats.html

「mopera U ケータイをパソコンとつないでインターネット・メールを楽しむ U家でも、外出先でも快適なインターネット環境を提供するドコモのモバイルユーザーのための通信サービスです。 」
とあります。
??デザリングとかあるから、いまどきこんなの不要じゃね?
と思いますが…。

moperaの契約をして、再度APNをmopera.netにしましたら、やっと通信ができるようになりました!!
しかし、後日もともとGalaxy Tabに入っていたSIMを同じようにNexusで使おうとしたら、mopera.netは使えず、open.mopera.netしか使えませんでした。。。

ちなみに、moperaの契約は、別にドコモショップへ行かなくってもドコモの使いづらーい設定画面から、契約が可能だそうです。
いつでも契約を解除することも可能です。

APNの設定方法は、設定→無線とネットワーク→モバイルネットワーク→アクセスポイント名→右上のプラスをタップ
名前とAPNに、mopera.netと記入して、戻るボタンをタップ、です。