ALGOBIT

2011/05/06

TCPサーバ ruby と python

Filed under: 離散的な気まぐれ — タグ: , , , — Kohyama @ 11:01

自分用まとめです.
各言語の TCPサーバ雛形としてのエコーサーバ.
クライアントから来たメッセージが変数で見える最小コードシリーズ.

ruby 版.
ポートを変えてる以外は 本家のリファレンス そのままですが.

require 'socket'

gs = TCPServer.open(1111)
addr = gs.addr
addr.shift

while true
    Thread.start(gs.accept) do |cs|
        while cs.gets
            cs.write($_)
        end
        cs.close
    end
end

python 版.
抽象化レイヤーは他にもあるようですが, 複数クライアントを相手にする, クライアントから送られて来たデータが変数で見える, 最小コードという趣旨だと SocketServer.ThreadingTCPServer が一番簡単なようです.

import SocketServer

class MyHandler(SocketServer.BaseRequestHandler):
	def handle(self):
		while True:
			data = self.request.recv(1024)
			if len(data) == 0:
				self.request.close()
				return
			self.request.send(data)

if __name__ == "__main__":
	HOST, PORT = "localhost", 1111
	server = SocketServer.ThreadingTCPServer((HOST, PORT), MyHandler)
	server.serve_forever()

UNIX系なら, いつも通りそれぞれ「#!/usr/bin/env ruby」, 「#!/usr/bin/env python」を一行目に挿入して chmod +x で直接実行.

Copyright © 2010 Yoshinori Kohyama All Rights Reserved.