Keep on moving

あんまりまとまってないことを書きますよ

socketプログラムの初歩から初める

近頃ネットワーク系のプログラムが気になるので勉強を開始してみました。
基礎の部分がまるでわかってないのでいろいろ検索して写経してます。
激しくチラ裏です。

socketプログラムの初歩と言われるEchoサーバー

http://www.python.jp/doc/2.5/lib/socket-example.htmlの写経

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket

HOST = ''
PORT = 50007
BACKLOG = 1
BUFSIZE = 1024

def main():
  # socketの作成
  # AF_INET : ipv4, SOCK_STREAM : TCP
  s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # ソケットにローカルアドレスをバインド
  s.bind((HOST, PORT))

  # 接続
  s.listen(BACKLOG)
  
  # 確立済みコネクションキューの先頭から、接続が完了している次の
  # コネクションを取り出し
  conn, addr = s.accept()
  print 'Connected by' , addr

  while 1:
    # データの受信
    data=conn.recv(BUFSIZE)
    if not data: break
    conn.send(data)
    
  conn.close()


if __name__ == '__main__':
  main()

telnetでつなぐ。

Echoサーバーをスレッドを使って複数接続に対応する

上のプログラムは1クライアントしかつなげないので、サーバーとして微妙
こういうときは

  1. threadを使う
  2. forkする
  3. selectなどを使う

パターンがあるようです。
今回はthreadのを写経します。

http://www.pvmgarage.com/2011/03/a-multi-threaded-persistent-echo-socket-server-in-python/の写経

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import thread

def handler(clientsock,addr):
    while 1:
        data = clientsock.recv(BUFSIZE)
        if not data:
            break
        msg = 'echoed:... ' + data
        clientsock.send(msg)
    clientsock.close()

HOST = ''
PORT = 50007
BACKLOG = 1
BUFSIZE = 1024

def main():
  # socketの作成
  # AF_INET : ipv4, SOCK_STREAM : TCP
  s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # ソケットにローカルアドレスをバインド
  s.bind((HOST, PORT))

  # 接続
  s.listen(BACKLOG)
  

  while 1:
    # 確立済みコネクションキューの先頭から、接続が完了している次の
    # コネクションを取り出し
    conn, addr = s.accept()
    print 'Connected by' , addr

    thread.start_new_thread(handler, (conn, addr))
    
  conn.close()


if __name__ == '__main__':
  main()

参考

まとめ

ひびこれ勉強よね