タリーサーバーを作る その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 とか・・