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クライアントしかつなげないので、サーバーとして微妙
こういうときは
- threadを使う
- forkする
- 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()
参考
- Python/Snippet/ネットワーク – アクセンスのおまけ あとでいろいろ写経します
まとめ
ひびこれ勉強よね