When it’s ready.

出来るまで出来ない

タリーサーバーを作る その2

やりたかった事は、エコーしないエコーサーバーらしい。
twisted使ってやりたかったのであるけれど、id:Voluntas氏が既にやってた>http://d.hatena.ne.jp/Voluntas/20080104/1199410736
さすがTwistedMindということか?

今回は、送信側に返す必要がないのでそこをざっくりカットして、生暖かく受け止める部分(プリントするだけ)を追加した。
さらに、サーバーの起動と終了をGuiでやりたいのでTkinterで緩く包み込んであげる。ポートをGUIから変更可能としてみた。

ソースをありがとうございます>ヴォルンタァスゥ

# coding:utf8
"""
tallyCpt.py

Created by atusi on 2008-03-20.
Copyright (c) 2008 __atusi.com__. All rights reserved.
"""
from Tkinter import *
from ScrolledText import ScrolledText
from datetime import datetime

from twisted.protocols import basic
from twisted.internet import protocol, reactor

class EchoServer(basic.LineReceiver):
    def connectionMade(self):
        self.factory.clients.append(self)

    def connectionLost(self):
        self.factory.clients.remove(self)

    def lineReceived(self, line):
        for client in self.factory.clients:
            client.message(line)

    def message(self, message):
        #self.transport.write(message + '\n')
        data = eval(message)
        typeList = []
        capt_massage(message)
        if (type(data)==type(typeList)):
            for i in data:
                print i
        else:
            print data

class MainForm(Frame):
  font = ('Courier', 10, 'normal')
  portNo = None
  
  def init(self):
    self.master.title("TallyServer")
    f = Frame(self, relief=SUNKEN, bd=1)
    
    #label_ip = Label(f, text="IP : ", font=self.font)
    #self.entry_ip = Entry(f, width=18, font=self.font)
    #label_ip.pack(side=LEFT)
    #self.entry_ip.pack(side=LEFT,padx=5)

    label_port = Label(f,text="port : ", font=self.font)
    self.entry_port = Entry(f, width=`4`, font=self.font)
    label_port.pack(side=LEFT)
    self.entry_port.pack(side=LEFT,padx=5)

    b0 = Button(f, text="set ", command=self.cmd1, font=self.font)
    b1 = Button(f, text="makeServer ", command=self.makeServer, font=self.font)
    b2 = Button(f, text="Exit", command=self.cmd_quit, font=self.font)
    
    self.text = ScrolledText(self, width=40,height=14,font=self.font)

    for e in [b0, b1, b2]: e.pack(side=LEFT, padx=5)
    for e in [f, self.text]:  e.pack(side=TOP, expand=YES, fill=BOTH,padx=1, pady=1)

  def cmd1(self):
    if (app.entry_port.get()==""):
      err_routine()
    else:
      self.portNo = app.entry_port.get()
      main_routine()

  def cmd_quit(self):
    self.master.destroy()

  def __init__(self, master=None):
    Frame.__init__(self, master)
    self.pack()
    self.init()

  def addline(self, content):
    self.text.config(state=NORMAL)
    self.text.insert(END, content)
    self.text.yview(END)
    self.text.config(state=DISABLED)
    self.update()
    
  def makeServer(self):
    self.factory = protocol.ServerFactory()
    self.factory.protocol = EchoServer
    self.factory.clients = []
    if self.portNo == None:
      err_routine()
    else:
      reactor.listenTCP(int(self.portNo), self.factory)
      reactor.run()

###
def main_routine():
    #ip = app.entry_ip.get()
    port = app.entry_port.get()
    
    oline = "port [ %s ]\n %s\n" % (port, datetime.now())
    app.addline(oline)

def err_routine():
    oline = "Port がセットされてないお\n%s\n" % (datetime.now())
    app.addline(oline)

def capt_massage(str):
    oline = "massage : \n%s\n%s" % (str, datetime.now())
    app.addline(oline)
   
###


if __name__ == '__main__':
    app = MainForm()
    app.mainloop()

問題は、serverをスタートさせたら、GUIに操作が戻ってこない事
早めに解決したい。

こういう時に効果的なのか分かんないけどスタックレスなやつも気になる。
http://omake.accense.com/wiki/PythonStacklessPythonSocket とか・・