皆さんの協力のもと,今日まとまった仕事が1つ片付いた.
皆さんの努力に頭が下がる思いだ.
まだ締切間際の作文が2つ手元にあるので一息ついている場合ではないが,
次のために少しだけ勉強を始めた.



プログラム間通信をさせたい,というのが次の課題だ.

チームの中にはこの手のプログラミングのプロもいるが,
自分でも多少は知らない事には議論にもならないので学ぼうと思う.

まずは socket の使い方,振る舞いを簡単なプログラムで理解したい.

ネットで調べるとすぐにみつかる簡単な例題を基に少し変更を加えたもので動作を検証した.
プログラム間のsocket通信は,一方をサーバー,他方をクライアントにして,接続を確立する.

プログラムは以下のような感じ.
====サーバー側==== ====クライアント側====
from socket import *

HOST = ''
PORT = 50007

s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
(conn, addr) = s.accept()

print 'Connected by', addr

while 1:
data = conn.recv(1024)
if not data:
print 'End'
break

print "Data receive : ", data

msg = raw_input()
if msg == ".":
break
conn.send('Ans : %s' % msg )

conn.close()
 
from socket import *

HOST = ''
PORT = 50007

s = socket(AF_INET, SOCK_STREAM)
s.connect((HOST, PORT))
while 1:
msg = raw_input()
if msg == '.':
break;

s.send(msg)

data = s.recv(1024)
if not data:
print 'End'
break

print 'Returned message :', data

s.close()


上記プログラムを2つのターミナル上で,それぞれサーバー,クライアントを立ち上げて実行してみる.

サーバー側は listen(1) のところで,クライアントからの connect が来るのを待つ.
クライアントが connect してきたら,それを accept して,connection を確立する.

その後,サーバーはメッセージの recv (受信)をするために待機,
クライアントは,メッセージを send (送信)するための文字列を標準入力から受け取り,それをサーバーに send する.
このとき,標準入力から入力された文字が . (ピリオド)だったら,break でクライアント側で処理が終わり,socket が close される.
このとき,サーバーは空の data を受け取り,'End' に入って,通信を close する.

入力がピリオドでなければ,サーバーは文字列を受信し,それを表示する.続いて,返信用文字列を標準入力から受け取り,クライアントへ send する.
クライアントは受信して 'Returned message' として表示する.
このときも,ピリオドが入力されればコネクションは切断される.

以下,実行例.
====サーバー側==== ====クライアント側====
22:30> python socket1_server.py
Connected by ('127.0.0.1', 52492)
Data receive : Hello
Hi. How are you?
Data receive : OK.
Bye!
End
 
22:31> python socket1_client.py
Hello
Returned message : Ans : Hi. How are you?
OK.
Returned message : Ans : Bye!
.




やじるし プログラム間通信関連メモの目次