udpBroadcast_socketclient

# -*- coding: utf-8 -*-
# __author__ = 'hejunwang'

###########################################################################
## Python code generated with wxFormBuilder (version Jun 17 2015)
## http://www.wxformbuilder.org/
##
## PLEASE DO "NOT" EDIT THIS FILE!
###########################################################################

import threading
import sys
import os
import socket
import time
import struct
import logging

import wx
import wx.xrc




# 统一使用utf-8格式
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
    reload(sys)
    sys.setdefaultencoding(default_encoding)

PORT = 54321
VERSION = 1.0


class R():
    def __init__(self):
        pass

    @staticmethod
    def exit():
        os.system("kill -9 " + str(os.getpid()))  # 杀掉进程


# 接收数据
class MulticastServerWorker(threading.Thread):
    def __init__(self, sock):
        threading.Thread.__init__(self)
        self.sock = sock
        self.r = 1
        print "MulticastServerWorker"
        logging.debug("MulticastServerWorker")

    def run(self):
        sock = self.sock
        packSize = 1024
        while self.r:
            data, client = sock.recvfrom(packSize)
            # time.sleep(1)
            print data, client
            logging.debug("MulticastServerWorker   recvfrom ")
            sock.sendto("bbbbb", client)


# 组播
class MulticastServer(threading.Thread):
    def __init__(self, addr, destaddr):
        threading.Thread.__init__(self)
        self.addr = addr
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20)
        # mreq = struct.pack("=4sl", socket.inet_aton(destaddr), socket.INADDR_ANY)
        # sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

        sock.bind(addr)
        self.sock = sock
        self.destaddr = destaddr

        worker = MulticastServerWorker(sock)
        worker.start()

        print "MulticastServer"
        logging.debug("MulticastServer")

        print self.addr
        print self.destaddr

        self.r = 1

    def run(self):
        sock = self.sock
        packsize = 1024
        # data = " i'm MulticastServer"
        print "run"
        logging.debug("run")
        # data = self.msg
        # print 'data :%s' %data
        addr1 = ('224.0.0.1', 9898)
        while self.r:
            print "send to message"
            logging.debug("send to message")

            sock.sendto("aaaaa", addr1)
            time.sleep(10)


# 广播
class BroadcastClientWorker(threading.Thread):
    def __init__(self, sock):
        threading.Thread.__init__(self)
        self.sock = sock
        self.r = 1

    def run(self):
        sock = self.sock
        packSize = 1024
        while self.r:
            data, client = sock.recvfrom(packSize)
            print u"BroadcastClientWorker 接收到数据--->", data, client
            logging.debug("接收到数据:" + str(data) + ";" + str(client))

            # 本机地址
            myname = socket.getfqdn(socket.gethostname())
            myaddr = socket.gethostbyname(myname)
            print myname
            print myaddr
            print "广播地址:", client[0]
            if myaddr == client[0]:
                print "广播地址为本机地址,不做处理"
                logging.debug("广播地址为本机地址,不做处理" + str(myaddr))
                continue


class BroadcastClient(threading.Thread):
    def __init__(self, addr, destaddr):
        threading.Thread.__init__(self)
        self.addr = addr
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind(addr)
        self.sock = sock
        self.destaddr = destaddr
        self.r = 1

        # worker = BroadcastClientWorker(sock)
        # worker.start()

    def run(self):
        sock = self.sock
        # print "BroadcastClient"
        while (self.r):
            sock.sendto("BroadcastClient", self.destaddr)
            print u"BroadcastClient发送数据-->", self.destaddr
            logging.debug("BroadcastClient发送数据" + str(self.destaddr))
            time.sleep(5)

# 执行一次广播
class BroadcastOnce(threading.Thread):
    def __init__(self, addr, destaddr,message):
        threading.Thread.__init__(self)
        logging.debug("BroadcastOnce")
        self.addr = addr
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind(addr)
        self.sock = sock
        self.destaddr = destaddr
        self.r = 1

        self.msg = message

    def run(self):
        sock = self.sock

        sock.sendto(self.msg, self.destaddr)
        print u"BroadcastOnce-->", self.destaddr
        logging.debug("BroadcastOnce" + str(self.destaddr))



# 接收线程
class receiveThread(threading.Thread):
    def __init__(self, add, window):
        threading.Thread.__init__(self)

        self.window = window

        self.timeToQuit = threading.Event()
        self.timeToQuit.clear()

        logging.debug('receiveThread init ')
        print 'receiveThread ...'
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind(add)

        self.BUFSIZE = 1024
        self.socket = sock


    def run(self):

        while True:
            data, client = self.socket.recvfrom(self.BUFSIZE)
            if client[0] == '':
                print 'Wait for client ...'
                logging.debug("Wait for client ...")
            else:
                logging.debug("接收到数据:" + str(data) + ";" + str(client))
                print 'received data:', data
                print  'from------>', client

                time.sleep(1)

                # 本机地址
                myname = socket.getfqdn(socket.gethostname())
                myaddr = socket.gethostbyname(myname)
                # print myname
                # print myaddr
                print "广播地址:", client[0]

                if myaddr == client[0]:
                    print "本机地址在广播...."
                    logging.debug("广播地址为本机地址,不做处理" + myaddr)
                    message1  =client[0]
                    message2  =data
                    wx.CallAfter(self.window.UpdataListBox,message1,message2)
                    # continue
                else:
                    print "等待显示到panel"
                    message1 = client[0]
                    message2 = data
                    wx.CallAfter(self.window.UpdataListBox,message1,message2)



###########################################################################
## Class MyFrame1
###########################################################################
class MyFrame1(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"UDP_SERVER", pos=wx.DefaultPosition,
                          size=wx.Size(910, 530), style=wx.CLOSE_BOX | wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)

        # 2s后 启动接收端
        wx.FutureCall(2000, self.sockreceive, "5s will call sockreive", name="socketreceive")

        self.initUi()
        self.menuInit()
        self.logcat()
        self.bindPlug()


    def sockreceive(self, *args, **kwargs):
        print 'start socket receive'
        logging.debug("开启线程 开始等待client 接入....")
        # 本机地址
        myname = socket.getfqdn(socket.gethostname())
        receiveaddr = socket.gethostbyname(myname)
        # print myname
        # print receiveaddr
        add = (receiveaddr, PORT)
        print 'receiveThread(add).start()'
        receiveThread(add, self).start()

    # init UI
    def initUi(self):
        bSizer1 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_panel1 = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL)
        bSizer2 = wx.BoxSizer(wx.HORIZONTAL)

        bSizer7 = wx.BoxSizer(wx.VERTICAL)

        sbSizer2 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel1, wx.ID_ANY, u"客户端"), wx.HORIZONTAL)

        bSizer10 = wx.BoxSizer(wx.VERTICAL)

        bSizer9 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_statatictext = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"地址:", wx.DefaultPosition,
                                            wx.DefaultSize, 0)
        self.m_statatictext.Wrap(-1)
        bSizer9.Add(self.m_statatictext, 0, wx.ALL, 5)

        self.m_textCtrl1 = wx.TextCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, u"255.255.255.255", wx.DefaultPosition,
                                       wx.DefaultSize, 0)
        bSizer9.Add(self.m_textCtrl1, 1, wx.ALL, 5)

        bSizer10.Add(bSizer9, 0, wx.EXPAND, 5)

        bSizer11 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_staticText4 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"端口:", wx.DefaultPosition,
                                           wx.DefaultSize, 0)
        self.m_staticText4.Wrap(-1)
        bSizer11.Add(self.m_staticText4, 0, wx.ALL, 5)

        self.m_textCtrl4 = wx.TextCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, u"54321", wx.DefaultPosition, wx.DefaultSize,
                                       0)
        bSizer11.Add(self.m_textCtrl4, 1, wx.ALL, 5)

        bSizer10.Add(bSizer11, 1, wx.EXPAND, 5)
        bSizer101 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_staticText41 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"信息:", wx.DefaultPosition,
                                            wx.DefaultSize, 0)

        self.m_staticText41.Wrap(-1)
        bSizer101.Add(self.m_staticText41, 0, wx.ALL, 5)

        self.m_textCtrl3 = wx.TextCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, u"1", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer101.Add(self.m_textCtrl3, 1, wx.ALL, 5)

        bSizer10.Add(bSizer101, 1, wx.EXPAND, 5)

        bSizer91 = wx.BoxSizer(wx.VERTICAL)

        self.m_button2 = wx.Button(sbSizer2.GetStaticBox(), wx.ID_ANY, u"发送", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer91.Add(self.m_button2, 0, wx.ALL | wx.ALIGN_RIGHT, 5)

        bSizer10.Add(bSizer91, 1, wx.EXPAND, 5)

        sbSizer2.Add(bSizer10, 1, wx.EXPAND, 5)

        bSizer7.Add(sbSizer2, 1, wx.EXPAND, 5)

        sbSizer3 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel1, wx.ID_ANY, u"发送/接收端"), wx.VERTICAL)

        bSizer12 = wx.BoxSizer(wx.HORIZONTAL)

        self.m_staticText7 = wx.StaticText(sbSizer3.GetStaticBox(), wx.ID_ANY, u"内容:", wx.DefaultPosition,
                                           wx.DefaultSize, 0)
        self.m_staticText7.Wrap(-1)
        bSizer12.Add(self.m_staticText7, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        m_choice3Choices = [u"组播                                              ",
                            u"广播                                               ",
                            u"广播3                                            "]
        self.m_choice3 = wx.Choice(sbSizer3.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
                                   m_choice3Choices, 0)

        bSizer12.Add(self.m_choice3, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        self.m_button3 = wx.Button(sbSizer3.GetStaticBox(), wx.ID_ANY, u"发送广播", wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer12.Add(self.m_button3, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5)

        sbSizer3.Add(bSizer12, 0, wx.EXPAND, 5)

        bSizer7.Add(sbSizer3, 1, wx.EXPAND, 5)

        bSizer2.Add(bSizer7, 1, wx.EXPAND, 5)

        self.m_staticline1 = wx.StaticLine(self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
                                           wx.LI_HORIZONTAL | wx.LI_VERTICAL)
        bSizer2.Add(self.m_staticline1, 0, wx.EXPAND | wx.ALL, 5)

        bSizer8 = wx.BoxSizer(wx.VERTICAL)

        sbSizer4 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel1, wx.ID_ANY, u"返回状态"), wx.HORIZONTAL)

        self.m_listBox2Choices = []
        self.m_listBox2 = wx.ListBox(sbSizer4.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize,
                                     self.m_listBox2Choices, wx.LB_HSCROLL | wx.LB_SINGLE)
        sbSizer4.Add(self.m_listBox2, 1, wx.ALL | wx.EXPAND, 5)

        bSizer8.Add(sbSizer4, 1, wx.EXPAND, 5)

        bSizer2.Add(bSizer8, 1, wx.EXPAND, 5)

        self.m_panel1.SetSizer(bSizer2)
        self.m_panel1.Layout()
        bSizer2.Fit(self.m_panel1)
        bSizer1.Add(self.m_panel1, 1, wx.EXPAND | wx.ALL, 5)

        self.SetSizer(bSizer1)


    # menu
    def menuInit(self):
        self.Layout()
        self.m_menubar1 = wx.MenuBar(0)
        self.m_menu1 = wx.Menu()
        self.m_menuItem1 = wx.MenuItem(self.m_menu1, wx.ID_ANY, u"创建", wx.EmptyString, wx.ITEM_NORMAL)
        self.m_menu1.AppendItem(self.m_menuItem1)

        self.m_menu1.AppendSeparator()

        self.m_menuItem4 = wx.MenuItem(self.m_menu1, wx.ID_ANY, u"退出", wx.EmptyString, wx.ITEM_NORMAL)
        self.m_menu1.AppendItem(self.m_menuItem4)

        self.m_menubar1.Append(self.m_menu1, u"文件")

        self.m_menu2 = wx.Menu()
        self.m_menuItem2 = wx.MenuItem(self.m_menu2, wx.ID_ANY, u"配置", wx.EmptyString, wx.ITEM_NORMAL)
        self.m_menu2.AppendItem(self.m_menuItem2)

        self.m_menubar1.Append(self.m_menu2, u"编辑")

        self.m_menu3 = wx.Menu()
        self.m_menuItem3 = wx.MenuItem(self.m_menu3, wx.ID_ANY, u"关于", wx.EmptyString, wx.ITEM_NORMAL)
        self.m_menu3.AppendItem(self.m_menuItem3)

        self.m_menubar1.Append(self.m_menu3, u"帮助")

        self.SetMenuBar(self.m_menubar1)

        self.m_statusBar1 = self.CreateStatusBar(1, wx.ST_SIZEGRIP, wx.ID_ANY)

        self.Centre(wx.BOTH)

        pass


    # bind event
    def bindPlug(self):
        # Connect Events
        self.m_button2.Bind(wx.EVT_BUTTON, self.OnSend)
        self.m_choice3.Bind(wx.EVT_CHOICE, self.OnChose)
        self.m_button3.Bind(wx.EVT_BUTTON, self.OnStartUdpSend)
        self.Bind(wx.EVT_MENU, self.OnClose, id=self.m_menuItem4.GetId())
        self.Bind(wx.EVT_MENU, self.OnAbout, id=self.m_menuItem3.GetId())


    # logcat
    def logcat(self):
        logging.basicConfig(level=logging.DEBUG,
                            format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                            datefmt='%a, %d %b %Y %H:%M:%S',
                            filename='LogCat_' + time.strftime('%Y-%m-%d-%H-%M-%S') + '.log',
                            filemode='w')



    def UpdataListBox(self,message1,message2):
        message  =message1+":"+message2
        #重复地址处理
        print  message1
        print  self.m_listBox2Choices
        if message in self.m_listBox2Choices:
            print  "message-->"+message1
        else:
            print  "把信息添加到listbox"
            self.m_listBox2Choices.append(message)

            #更新设置listbox
            self.m_listBox2.Set(self.m_listBox2Choices)

    # Virtual event handlers, overide them in your derived class
    def OnSend(self, event):

        if self.m_textCtrl1.GetValue()!="" and int(self.m_textCtrl4.GetValue())<65535 and self.m_textCtrl3.GetValue()!="":

            print self.m_textCtrl1.GetValue()
            print self.m_textCtrl4.GetValue()
            print self.m_textCtrl3.GetValue()
            print "发送一次广播"


            LocalIP1 = socket.gethostbyname(socket.gethostname())
            print  "LocalIP1", LocalIP1
            BROADCASTADDRESS  ='255.255.255.255'

            BroadcastOnce((LocalIP1,PORT),(BROADCASTADDRESS,PORT),self.m_textCtrl3.GetValue()).start()



        # event.Skip()


    def OnChose(self, event):
        print self.m_choice3.GetString(self.m_choice3.GetSelection())
        print self.m_choice3.GetSelection()
        print self.m_choice3.GetStringSelection(), self.m_choice3.GetCurrentSelection()

        if self.m_choice3.GetSelection() == 0:
            print '选择了-->%s' % self.m_choice3.GetString(self.m_choice3.GetSelection())

            self.chosenumber = 0


        elif self.m_choice3.GetSelection() == 1:
            print '选择了-->%s' % self.m_choice3.GetString(self.m_choice3.GetSelection())

            self.chosenumber = 1
        elif self.m_choice3.GetSelection() == 2:
            print '选择了-->%s' % self.m_choice3.GetString(self.m_choice3.GetSelection())
            self.chosenumber = 2

        event.Skip()


    def OnStartUdpSend(self, event):
        print 'startudpsend'
        logging.debug('OnStartUdpSend')

        if self.chosenumber == 0:
            print 'startudpsend  self.m_choice3.GetSelection broadcast0'
            self.message0 = 'broadcast0'
            addr = '224.0.1.255'
            server = MulticastServer(("0.0.0.0", PORT), addr)
            server.start()


        elif self.chosenumber == 1:
            print 'startudpsend  self.m_choice3.GetSelection SOCK_DGRAM'
            LocalIP = socket.gethostbyname(socket.gethostname())
            print  "LocalIP", LocalIP
            BROADCASTADDRESS  ='255.255.255.255'
                                    # server(接收端)            发送端
            server3 = BroadcastClient((LocalIP, PORT), (BROADCASTADDRESS, PORT))
            server3.start()


        elif self.chosenumber == 2:
            print 'startudpsend  self.m_choice3.GetSelection broadcast2'

        event.Skip()


    def OnClose(self, event):
        print "OnClose"
        self.Destroy()
        event.Skip()


    def OnAbout(self, event):
        print "OnAbout"
        description = """The tool is made for better execution of android automaiton ,the code is python and the current version is """ + str(
            VERSION) + """ and will be updatad slowly,if there is a problem is exuecution ,contact me ,My name is toby"""

        info = wx.AboutDialogInfo()
        info.SetVersion(str(VERSION))
        info.SetDescription(description)
        info.AddDeveloper('JUNWANG He,Email: [email protected]')
        wx.AboutBox(info)
        event.Skip()


if __name__ == '__main__':
    app = wx.App()
    MyFrame1(None).Show()
    app.MainLoop()

猜你喜欢

转载自blog.csdn.net/hejunw/article/details/74912383
今日推荐