(一)创建界面
wxFronBuilder
使用方法,在TCP通信详细介绍过,大致如图:
创建完成,选中项目->code选择Python
保存->点击F8获得 noname.py
noname.py 部分截图:
(二)创建UdpChat项目
eclipse
创建udpChat项目,并把 noname.py 引入粘贴就行
:
注:noname.py 原文件夹的位置要引入到eclipse项目中,引入方法在TCP聊天中也说过,我依然放在wxFrom目录下,这里跳过引入步骤
(三)一个简单的Demo
具体的UDP通信方法,在代码注释中有讲解
1、打开_init _.py
源码:
_init _.py
# udpclient
import wx
import noname
import socket
import threading
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建套接字
class ClientFrame(noname.MyFrame1):
def __init__(self, parent):
noname.MyFrame1.__init__(self, parent)
def btn_login(self, event):
ipStr = self.ip_text.GetValue()
portStr = int(self.port_text.GetValue())
# 创建udp套接字进行连接
udp_socket.bind((ipStr, portStr)) # 服务器绑定ip和端口
self.showmessage.AppendText('----已上线!----\n') # 显示连接成功
def btn_send(self, event):
# while True:
send_ip = self.send_ip.GetValue()
send_port = int(self.send_port.GetValue())
send_address = (send_ip, send_port) # 发送地址
send_msg = self.sendmessage.GetValue() # 获得发送内容
send_data = send_msg.encode('utf-8') # 转码
self.showmessage.AppendText('\n 说:%s' % send_msg)
# sendto(发送数据,发送地址)
udp_socket.sendto(send_data, send_address)
self.sendmessage.SetValue("") # 清空输入栏
# 接收信息
recv_data = udp_socket.recv(1024)
recv_data = recv_data.decode('utf-8')
self.showmessage.AppendText('\n 收到信息为:%s' % recv_data)
print('收到信息为:%s' % recv_data)
def btn_out(self, event):
self.Close(True) # 关闭窗口
def main():
app = wx.App(False)
frame = ClientFrame(None)
frame.Show(True)
# 启动窗口
app.MainLoop()
if __name__ == "__main__":
try:
main()
finally:
udp_socket.close()
3、运行结果:
运行
两次
client可以对话,不过是sendto直接发送消息,没有通过server,本来想通过server转播的,让server可以查看所有人的对话,不过没成功!emm
还有我在点击发送后才能收到,简单聊天如下:
附:
我的参考 noname.py:
# -*- coding: utf-8 -*-
###########################################################################
## Python code generated with wxFormBuilder (version Jan 23 2018)
## http://www.wxformbuilder.org/
##
## PLEASE DO *NOT* EDIT THIS FILE!
###########################################################################
import wx
import wx.xrc
###########################################################################
## Class MyFrame1
###########################################################################
class MyFrame1 ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 619,466 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
bSizer2 = wx.BoxSizer( wx.VERTICAL )
bSizer8 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"创建我的IP:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText1.Wrap( -1 )
bSizer8.Add( self.m_staticText1, 0, wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.BOTTOM|wx.LEFT, 5 )
self.ip_text = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer8.Add( self.ip_text, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u" Port:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText3.Wrap( -1 )
bSizer8.Add( self.m_staticText3, 0, wx.ALIGN_CENTER_VERTICAL|wx.TOP|wx.BOTTOM|wx.LEFT, 5 )
self.port_text = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer8.Add( self.port_text, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
self.m_staticText7 = wx.StaticText( self, wx.ID_ANY, u"(1024~65535)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText7.Wrap( -1 )
bSizer8.Add( self.m_staticText7, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
bSizer8.Add( ( 0, 0), 1, wx.EXPAND, 5 )
self.enter_btn = wx.Button( self, wx.ID_ANY, u"进入", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer8.Add( self.enter_btn, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
bSizer2.Add( bSizer8, 1, wx.EXPAND, 5 )
bSizer1.Add( bSizer2, 1, wx.EXPAND, 5 )
bSizer3 = wx.BoxSizer( wx.VERTICAL )
self.showmessage = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE )
bSizer3.Add( self.showmessage, 1, wx.ALL|wx.EXPAND, 5 )
bSizer1.Add( bSizer3, 3, wx.EXPAND, 5 )
bSizer4 = wx.BoxSizer( wx.VERTICAL )
bSizer81 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticText4 = wx.StaticText( self, wx.ID_ANY, u"接收者的ip:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText4.Wrap( -1 )
bSizer81.Add( self.m_staticText4, 0, wx.ALL, 5 )
self.send_ip = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer81.Add( self.send_ip, 0, wx.ALL, 5 )
self.m_staticText6 = wx.StaticText( self, wx.ID_ANY, u"Port:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText6.Wrap( -1 )
bSizer81.Add( self.m_staticText6, 0, wx.ALL, 5 )
self.send_port = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer81.Add( self.send_port, 0, wx.ALL, 5 )
self.m_staticText8 = wx.StaticText( self, wx.ID_ANY, u"(1024~65535)", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText8.Wrap( -1 )
bSizer81.Add( self.m_staticText8, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 )
bSizer81.Add( ( 0, 0), 1, wx.EXPAND, 5 )
bSizer4.Add( bSizer81, 0, wx.EXPAND, 5 )
bSizer5 = wx.BoxSizer( wx.VERTICAL )
self.me = wx.StaticText( self, wx.ID_ANY, u"发送的消息:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.me.Wrap( -1 )
bSizer5.Add( self.me, 0, wx.ALL, 5 )
self.sendmessage = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer5.Add( self.sendmessage, 1, wx.ALL|wx.EXPAND, 5 )
bSizer4.Add( bSizer5, 2, wx.EXPAND, 5 )
bSizer7 = wx.BoxSizer( wx.HORIZONTAL )
bSizer7.Add( ( 0, 0), 1, wx.EXPAND, 5 )
self.send_btn = wx.Button( self, wx.ID_ANY, u"发送", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer7.Add( self.send_btn, 0, wx.ALL|wx.ALIGN_RIGHT, 5 )
self.exit_btn = wx.Button( self, wx.ID_ANY, u"退出", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer7.Add( self.exit_btn, 0, wx.ALL|wx.ALIGN_RIGHT, 5 )
bSizer4.Add( bSizer7, 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5 )
bSizer1.Add( bSizer4, 3, wx.EXPAND, 5 )
self.SetSizer( bSizer1 )
self.Layout()
self.Centre( wx.BOTH )
# Connect Events
self.enter_btn.Bind( wx.EVT_BUTTON, self.btn_login )
self.send_btn.Bind( wx.EVT_BUTTON, self.btn_send )
self.exit_btn.Bind( wx.EVT_BUTTON, self.btn_out )
def __del__( self ):
pass
# Virtual event handlers, overide them in your derived class
def btn_login( self, event ):
event.Skip()
def btn_send( self, event ):
event.Skip()
def btn_out( self, event ):
event.Skip()