PythonでSocketサーバ、クライアントの接続方法を下記のソースコードを用いて確認。C言語のどう程度のサンプルと比較すると行数が少なく、書きやすい。これがThreadやノンブロッキング・多重化を用いた時にどの程度膨らむかは今後確認予定。
ソースコード(for Python 2.7)
補足はソースコード中のコメントを参照。サンプルの為、サーバ・クライアントは同一マシン上での実行を想定。
tsTcpServ.py
# coding: utf-8
from socket import *
from time import ctime
HOST = gethostname()
PORT = 34567
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Server'
tcpSerSock = socket(AF_INET, SOCK_STREAM) # IPv4/TCPソケットとして作成
tcpSerSock.bind(ADDR) # アドレス、ポートのbinding
tcpSerSock.listen(5) # サーバソケットの最大接続要求の順番待ち数
while True:
print 'Waiting for connection...'
(tcpCliSock, addr) = tcpSerSock.accept() # 接続待受開始
print '...connected from.' , addr
while True:
data = tcpCliSock.recv(BUFSIZE) # C->Sデータの受信
if not data:
break
tcpCliSock.send('%s > [%s] %s' % (USER, ctime(), data)) # S->Cデータの送信
tcpCliSock.close() # Clientソケットのclose
tcpSerSock.close() # Serverソケットのclose (到達不能コード)
tsTcpclnt.py
# coding: utf-8
from socket import *
HOST = gethostname()
PORT = 34567
BUFSIZE = 1024
ADDR = (gethostbyname(HOST), PORT)
USER = 'Client'
tcpClntSock = socket(AF_INET, SOCK_STREAM)
tcpClntSock.connect(ADDR)
while True:
data = raw_input('%s > ' % USER) # 標準入力からのデータ入力
if not data:
break
tcpClntSock.send(data) # C->Sへデータ送信
data = tcpClntSock.recv(BUFSIZE) # S->Cのデータ受信
if not data:
break
print data
tcpClntSock.close()
実行結果
tsTcpServ.py
Waiting for connection...
...connected from. ('192.168.11.2', 52208)
Waiting for connection...
...connected from. ('192.168.11.2', 52211)
Waiting for connection...
tsTcpClnt.py
C:\pleiades\workspace\pyTest\src>python tsTcpClnt.py Client > hello Server > [Sat May 19 18:52:12 2012] hello Client > good Server > [Sat May 19 18:52:17 2012] good Client > how about you Server > [Sat May 19 18:52:30 2012] how about you Client > C:\pleiades\workspace\pyTest\src>python tsTcpClnt.py Client > reconnect Server > [Sat May 19 18:52:42 2012] reconnect Client > end Server > [Sat May 19 18:52:44 2012] end Client >
参考サイト
- ソケットプログラミング HOWTO — Python 2.7ja1 documentation
コメント
[…] http://www.yukun.info/blog/2012/05/python-socket-server-client.html […]