すごく簡単なソケット通信をやってみる

Foundations of Python Network Programming

タイトル通りだけど、ほんとに単純なソケット通信をやってみる。本当は通信をする際には例外処理や終端文字指定、スレッド処理などたくさんやらなければならないことがあるのだが、それは少しずつ実装することにして、まず基本からやろう。

今回はサーバ側とクライアント側を想定して二つのプログラムを作った。同じPC内でポート番号15000を使って通信をする。クライアント側はタイプされた文字列を次々にサーバ側に送り、サーバ側は受け取った文字列を表示するだけである。その内容は以下のようにしてみた。

simpleserver.py

import socket
host = ''
port = 15000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(1)
print 'Waiting for connections...'
clientsock, clientaddr = s.accept()
while 1:
rcvmsg = clientsock.recv(1024)
print 'You received -> %s' % (rcvmsg)
if rcvmsg == '':
break
clientsock.close()

simpleclient.py

import socket
host = 'localhost'
port = 15000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
while 1:
print 'Type message you want to send...'
msg = raw_input()
if msg == '':
s.close()
break
s.sendall(msg)

listen(1)というのは、処理がマルチスレッドではないとして、いくつまでクライアントを待たすことを許すのか、という設定らしい。今回は1つだけ許すということになる。recv(1024)というのはソケットからデータを10KBだけ読み取るということ(今回は問題になりませんが、もしこのプログラムで10KBを超える文字列を送信すると、上手くいかないはず)。

サーバ側を先に実行し、クライアント側を次に実行する。幾つかの文字列を入力した実行結果は以下。

実行結果(クライアント側)

C:\Python24>python.exe simpleclient.py
Type message you want to send...
Hello world!
Type message you want to send...
I love you!
Type message you want to send...
Python is a great language.
Type message you want to send...

実行結果(サーバ側)

C:\Python24>python.exe simpleserver.py
Waiting for connections...
You received -> Hello world!
You received -> I love you!
You received -> Python is a great language.
You received -> 

特に問題なく送れているようです。今後はこれを基に色々と処理を追加していこうかな。