Питон начал изучать вместе с этим заданием так , что извините за нубские вопросы.
Не могу понять как синхронизировать запуск всех клиентов , в данном случае по нажатию кнопки.
Прошу помощи потому что нужно сдать очень короткие сроки.
Вот то что я уже написал работает только с 1 клиентом…
Сервер:
# -*- coding: cp1251 -*-
import wx
import wx.xrc as xrc
import sys
import socket, string, pickle, struct
import threading
import Queue
PORT = 2337
class Main(wx.App):
def OnInit(self):
self.res = xrc.XmlResource('mainframe.xrc')
self.InitFrame()
self.MainFrame.Show()
self.TasksPool = Queue.Queue(0)
ServerThread(self.TasksPool, self.MainFrame).start()
return True
def InitFrame(self):
self.MainFrame = self.res.LoadFrame(None, 'FRAME1')
self.MainFrame.Bind(wx.EVT_BUTTON, self.OnClickStart, xrc.XRCCTRL(self.MainFrame, 'Button1'))
def OnClickStart(self, event):
try:
start = int(xrc.XRCCTRL(self.MainFrame, 'Edit1').GetValue().strip())
end = int(xrc.XRCCTRL(self.MainFrame, 'Edit2').GetValue().strip())
pre_string = xrc.XRCCTRL(self.MainFrame, 'Memo1').GetValue()
xrc.XRCCTRL(self.MainFrame, 'Memo1').SetValue(pre_string + "Диапазон вычислений принят. От %d до %d.\r\n" % (start, end))
except:
dlg = wx.MessageDialog(self.MainFrame, 'Некорректный ввод. Заполните поля целыми числами.', caption="Ошибка", style=wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
if start > end:
dlg = wx.MessageDialog(self.MainFrame, 'Некорректный ввод.', caption="Ошибка", style=wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
self.TasksPool.put((start, end))
xrc.XRCCTRL(self.MainFrame, 'Button1').Disable()
class ServerThread(threading.Thread):
def __init__(self, TasksPool, MainFrame):
self.TasksPool = TasksPool
self.ClientPool = Queue.Queue(0)
self.MainFrame = MainFrame
threading.Thread.__init__(self)
def run(self):
self.th = ClientsThread(self.ClientPool, self.TasksPool, self.MainFrame)
self.th.start()
self.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.srv.bind(('', PORT))
self.srv.listen(1)
while 1:
self.ClientPool.put(self.srv.accept())
class ClientsThread(threading.Thread):
def __init__(self, ClientPool, TasksPool, MainFrame):
self.TasksPool = TasksPool
self.MainFrame = MainFrame
self.ClientPool = ClientPool
threading.Thread.__init__(self)
def run(self):
while True:
client = self.ClientPool.get()
if client != None:
start, end = self.TasksPool.get()
pos = [start, end]
pre_string = xrc.XRCCTRL(self.MainFrame, 'Memo1').GetValue()
xrc.XRCCTRL(self.MainFrame, 'Memo1').SetValue(pre_string + "Клиент присоединился.(%s)\r\n" %(client[1][0] ))
client[0].send(pickle.dumps(pos))
temp = client[0].recv(4000000)
array = pickle.loads(temp)
j = 0
while j < len(array):
pre_string = xrc.XRCCTRL(self.MainFrame, 'Memo1').GetValue()
xrc.XRCCTRL(self.MainFrame, 'Memo1').SetValue(pre_string + "%d\r\n" % (int(array[j])))
j = j + 1
client[0].close()
xrc.XRCCTRL(self.MainFrame, 'Button1').Enable()
def main():
application = Main()
application.MainLoop()
if __name__ == '__main__':
main()
# -*- coding: cp1251 -*-
import wx
import wx.xrc as xrc
import socket
import pickle
import struct
def primenumb(a):
i=2
while i<a:
c=a%i
if c==0:
res=1 # не простое число
break
else:
res=0 # простое число
i=i+1
return res
def primeinrange(i0, ik):
a=ik-i0
a=a/2
temp = range(a)
ind=0
for i in xrange(i0, ik):
if primenumb(i) == 0:
temp[ind] = i
ind=ind+1
Result = range(ind)
for i in xrange(0, ind):
Result[i] = temp[i]
return Result
PORT = 2337
class Main(wx.App):
def OnInit(self):
self.res = xrc.XmlResource('client.xrc')
self.InitFrame()
self.MainFrame.Show()
return True
def InitFrame(self):
self.MainFrame = self.res.LoadFrame(None, 'Client')
self.MainFrame.Bind(wx.EVT_BUTTON, self.OnClickConnect, xrc.XRCCTRL(self.MainFrame, 'Button1'))
def OnClickConnect(self, event):
try:
HOST = str(xrc.XRCCTRL(self.MainFrame, 'Edit1').GetValue().strip())
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client.connect((HOST, PORT))
xrc.XRCCTRL(self.MainFrame, 'Button1').Disable()
except:
dlg = wx.MessageDialog(self.MainFrame, 'Ошибка соединения. Проверьте ваше соединение с интернетом.', caption="Ошибка", style=wx.OK | wx.ICON_ERROR)
dlg.ShowModal()
dlg.Destroy()
data = self.client.recv(1024)
pos = pickle.loads(data)
start = pos[0]
end = pos[1]
temp = primeinrange(start, end)
array = pickle.dumps(temp)
self.client.send(array)
self.client.close()
xrc.XRCCTRL(self.MainFrame, 'Button1').Enable()
def main():
application = Main()
application.MainLoop()
if __name__ == '__main__':
main()