Python を使ってプログラム間通信の仕方を勉強している.
これまでに,socket レベルの関数を用いて,TCP を使った情報の送受信とUDP を使ったブロードキャストの仕方を学んだ.
今回は,これらを組み合わせて以下のような仕様のプログラムを作る.
情報の sender は,receiver がどこにいるかわからない.
なので,sender は,あるメッセージをブロードキャストに投げる.同時にブロードキャストメッセージの受信に備える.
receiver は,ブロードキャストメッセージを待ち受けていて,あるメッセージがどこかから届いたら,同じくブロードキャストに自分の IP アドレスを送る.
sender は receiver からの返信を受け取って,receiver がネットワーク内に居ることとその IP アドレスを確認する.
ここまでで,sender は receiver の IP アドレスを知ることができた.
次に,sender は receiver の IP アドレスに対して TCP コネクションを張ることを試みる.
receiver は TCP コネクションの接続要求待ち状態になっている.
ここでコネクションが成立すれば,sender は情報を送り,receiver は情報を受け取る.
ここでいう情報とは何らかの文字列である.例では XML センテンスを送っている.
上記のような振る舞いを期待して以下のコードを書いた.
上記 Sender と Receiver をそれぞれ同一ネットワーク上に存在する1台のマシン(計2台)で実行してみる.
実行結果は以下のようになる.
実はこれにはまだ不具合がある.
送信するメッセージ(例ではXMLセンテンス)が長くなると,センテンスの前の方の一部のみしか受信できないことがある.
これは情報が複数のパケットに断片的に乗っており,そのパケットがばらばらと届いているのに,そのパケットを拾いきれていないからだと Dr. K にアドバイスをもらった.
情報が断片的に乗っている複数のパケットを全て的確に受信するように改良する必要がある.
プログラム間通信関連メモの目次
これまでに,socket レベルの関数を用いて,TCP を使った情報の送受信とUDP を使ったブロードキャストの仕方を学んだ.
今回は,これらを組み合わせて以下のような仕様のプログラムを作る.
情報の sender は,receiver がどこにいるかわからない.
なので,sender は,あるメッセージをブロードキャストに投げる.同時にブロードキャストメッセージの受信に備える.
receiver は,ブロードキャストメッセージを待ち受けていて,あるメッセージがどこかから届いたら,同じくブロードキャストに自分の IP アドレスを送る.
sender は receiver からの返信を受け取って,receiver がネットワーク内に居ることとその IP アドレスを確認する.
ここまでで,sender は receiver の IP アドレスを知ることができた.
次に,sender は receiver の IP アドレスに対して TCP コネクションを張ることを試みる.
receiver は TCP コネクションの接続要求待ち状態になっている.
ここでコネクションが成立すれば,sender は情報を送り,receiver は情報を受け取る.
ここでいう情報とは何らかの文字列である.例では XML センテンスを送っている.
上記のような振る舞いを期待して以下のコードを書いた.
=== Sender === | === Receiver === | |
from socket import * | from socket import * |
上記 Sender と Receiver をそれぞれ同一ネットワーク上に存在する1台のマシン(計2台)で実行してみる.
実行結果は以下のようになる.
=== Sender === | === Receiver === | |
17:16.montepulciano[11] python sender.py | 17:16.barbaresco[43] python receiver.py |
実はこれにはまだ不具合がある.
送信するメッセージ(例ではXMLセンテンス)が長くなると,センテンスの前の方の一部のみしか受信できないことがある.
これは情報が複数のパケットに断片的に乗っており,そのパケットがばらばらと届いているのに,そのパケットを拾いきれていないからだと Dr. K にアドバイスをもらった.
情報が断片的に乗っている複数のパケットを全て的確に受信するように改良する必要がある.
![やじるし](https://emoji.ameba.jp/img/user/yu/yuka-k-blog/12799.gif)