คือผมจะเขียนโปรแกรมเป็น client ติดต่อกับ server แต่ client จะต้อง run รอการติดต่อกับ server ตลอดเวลาที่โปรแกรมทำงานอยู่นะครับ
ไม่ทราบว่าผมจะต้องใช้ library อะไรหรือครับ หรือว่าให้ต้องเขียนเป็นเทรดหรือครับ หรือว่าต้องเขียนให้โปรแกรมรันเองทุกๆ 1 นาทีเพื่อตรวจสอบอะครับ
code ที่ผมเขียนขณะนี้อะครับ คือเมื่อผมติดต่อกับ server ได้เรียบร้อยแล้ว ผมต้องการให้โปรแกรมที่ผมเขียนรันไปดึงข้อมูลที่ได้จาก
server ตลอดเวลาที่โปรแกรมทำงานอยู่ครับ ในcode ผมลองใช้ทั้ง timer และ thread แต่ก็โปรแกรมล่มตลอดเลยครับ
def OnConnetServer(self, event):
self.tcpsoc = socket(AF_INET, SOCK_STREAM)
try:
self.tcpsoc.connect(self.ADS)
self.SetStatusText("ติดต่อกับ sever ได้แล้ว ".decode("utf-8"))
self.isConnet = True
ss = threading.Timer(30, self.OnRequestServer())
ss.start()
while 1:
self.OnRequestServer()
except:
self.isConnet = False
self.SetStatusText("ไม่สามารถติดต่อกับ sever ได้ ".decode("utf-8"))
def OnRequestServer(self):
#self.t1 = wx.Timer(self)
#self.t1.Start(1000)
data = self.tcpsoc.recv(1024)
if not data:
print "no data from server "
else:
self.temText += "Server : " + str(data) + '\n'
self.txtMsgList.SetValue(self.temText)
#self.t1.Stop()
#del self.t1
มีสองแบบให้เลือก
1. ใช้ SocketServer ซึ่งเป็นการ implement แบบ thread มีให้เลือกทั้ง TCP (ThreadingTCPServer) และ UDP (ThreadingUDPServer)
2. ใช้ Asynchronous socket handler (asyncore, asynchat ) ตัวนี้ใช้เทคนิค os call ที่ชื่อ select อันนี้มันกว่า ประสิทธิภาพดีกว่าและโค๊ดสะอาดกว่าเพราะเป็น single process
ขอบคุณครับ
ใช่ SELECT ตัวนี้หรือเปล่าครับคุณ meledictas ถ้าใช่เดี่ยวไปลองดูก่อนครับ
The select module is a python module for accessing the select() and poll() system core. You can use it but it is unnecessary, there is a high-level implementation. See http://effbot.org/librarybook/asyncore.htm for more detail. :)
ลองใช้ Twisted ดูดีกว่าครับ จะได้ไม่ต้องมาปวดหัวกับเรื่องพวกนี้