TCPソケットを使う
ライブラリ同心円
1 準備
- 添付ライブラリの1つとして提供されている、socket の1つのクラス。
- ドキュメントは 添付ライブラリの net セクション
- (ドキュメントにあるように)先頭部にrequire式が必要
- ケースにご注意
(TCPは略語なので大文字、
Socketが1つの単語なので先頭が大文字)
- 今日使う TCPSocketは、右図のクラス階層構造に位置する(右下のほう)。
- IO クラスのサブクラスであり、IO#puts, IO#gets
などを継承して使うことになる、
という(オブジェクト指向の)原理を確認しておこう。
- open(newでもいいが一般にはopenが使われる)特異メソッドの
必須の引数は(File.openの時とは違い)2つ(次項で解説する)
2 ネットワークの基礎の基礎
- 用語の整理
- 今般、HTTPという用語が出てくるが、この単語は以下の3つの場面で使われるので、その意味を区別して認識しておくこと

- プロトコル(アプリケーション層)の名称としての HTTP
- URLのスキーム名(
:// の左側)
- サービス名(ポート番号に対応する)
- TCP/IPについて:
- TCP/IPは プロトコルスイートの1つ
- で、かつ、現在最も普及しているもの。
- 普及の理由はインターネットとともに広がったこと。
- (他にも右図のようにいくつかのプロトコルスイートが存在するが)

- なおこの名称は、TCP/IPを構成する多数の規約のうち最も重要な役割を果たす
2つのプロトコルの名前をつないだもので、
テイィーピーアイピーと読む(スラッシュは読まない)ことが多い。
- いわば TCP と IP と その仲間たち、というような命名
(海外の会社名でそのような命名の企業が散見される。 有名なところではティファニーや
P&Gなどがある)。
- 階層構造:
- TCP/IPは4層(右下図のような説明図が多数ネットにあり、解説もされているので、眺めておいて下さい)
- OSI参照モデルでは7層構造が示されるが、TCP/IPはそれを若干簡略化した形で実現している。

- ソケットとは:
- 通信の末端(両端)で働くソフトウェア部品
- 元来の意味は、何かを差し込める凹部のあるもの(蝋燭の土台など)、そこから転じて、ソケットレンチ、水道管の継ぎ手などにも使われ、
- 電気回路部品のイメージから通信のための端子をソケットと呼ぶようになったようだ。
- IPソケット UDPソケット TCPソケットなどがある
- IPとUDPはデータグラムサービス(コネクションレス)、
- TCPはストリームサービス(コネクション)
- TCPの特徴:
- 一旦コネクションを確立すると(開放されるまで)
相手のアドレス等を意識することなく データをたれ流しで
送受信(双方向に)行うことができる
- 確認応答や再送を内部で行っており信頼性が高い
(とは言えネットの切断や著しい混雑の際は切れることもある)
- 以上の特徴によりプログラム上はファイルや標準入出力と
同等に読み書きができる
- 接続を識別するための4つの必須項目:
- ドメイン名とIPアドレスの関係:
やはりコマンドプロンプトで以下のコマンドに、
WebのURLでよく見られるドメイン名を与えてみる
nslookup www.nagano.ac.jp
nslookup www.google.co.jp
ドメイン名は、以下の例で太字で示した箇所でよく使われる
URL中で
http://
nan.to.ka/file/file
メールアドレスで daresore@
nan.to.ka

なお、URLの、ドメイン名が入る場所に、ドメイン名の代わりに
それに相当するIPアドレスを書いてアクセスしても、
同じWebページが表示されることが多い(サーバの設定によってはアクセス
できない場合もあるが)。
- ポート番号とは:
- 右図のように、一台のコンピュータ(サーバでもクライアントでも)では
複数のネットワークプログラムが同時に稼働するのが普通である
- 外部からネットワークを通じて(図の下から)到来した通信内容は、IPアドレスで
識別されてこのコンピュータに届く、が、
- 具体的にどのプロムに届く3 :
- 外部からのリクエストを受け付けるサーバプログラムでは、定められたポート番号を
使うことになっている。
- ウエルノウンサービスを確認されたし
- ただし自分のPCが全部を識別している訳ではない
3 TCPSocketの簡単なプログラム例
以下の例(ここにも置いてある)で、ブロックの中が通信内容となる。
require 'socket'
host='www2.nagano.ac.jp'
port='http'
resource='/hiraoka/'
TCPSocket.open(host,port) do |s|
s.puts "GET #{resource} HTTP/1.0" ; s.puts
puts s.gets(nil)
end
- なお、古いソースファイルがこのリンク先に残っていました(このファイル httpGet0.rb)。
この古いソースでは大学のオフィシャルWebページのサーバにHTTPでアクセスを試みていて、エラーになります。このエラーになる現実も、試してみておいて下さい。
補足1
この例(前回のファイル入出力のときも同様)で 関数(メソッド)puts, gets
は
- レシーバなしの、関数呼出の形 puts, gets
- f などの変数(に保持されたオブジェクト)をレシーバとして、f.puts,
f.gets などの形でのメソッド呼出
の2つの形で出現している。
補足2
openとputs