本帖最后由 展展 于 2014-4-13 20:32 编辑
当学到毕老师教的GUI各种组件,心里很开心,因为第一次玩有图形界面的编程,以前都是黑框框DOS命令行,玩图形界面的确很爽。
我是之前学会在DOS命令行下实现Udp网络聊天的基础上,利用GUI实现一个图形化界面的网络聊天程序。
端口是设置好的10003,聊天的对方ip可以自己设置,也可以设置为广播ip群聊。
具体的思路或者说实现方法是这样的:
先建立图形化界面,调一调大小,设置好了就开始写代码了。
监听Button,就是信息发送的Button,代码是先把发送消息的窗口字符串保存到一个String str 变量里,保存完就可以清空发送窗口了,我们只需要这个String str ----发送的内容。
然后就是写Udp发送端和接受端的部分了,我还是喜欢使用多线程。将String str转成byte[] 为参数作为数据包。
在注意一下,发送端和Button需要一个锁来保持同步性。就是我点一下消息发送,Udp发送端在活一下,走一次代码。
具体还是看代码吧。
- /*
- 展展聊天工具
- */
- import java.awt.*;
- import java.awt.event.*;
- import java.net.*;
- import java.io.*;
- import java.util.concurrent.locks.*;
- class ZZOnline
- {
- private Frame f;
- private TextField setIP;
- public static TextArea recewindow;
- private TextArea sendwindow;
- private Button but;
- public static String info;
- public static String ip="127.0.0.1";
- public static Lock lock=new ReentrantLock();
- public static Condition con1=lock.newCondition();
- public static Condition con2=lock.newCondition();
- public static boolean flag=true;
- ZZOnline()
- {
- init();
- }
- public void init()
- {
- f=new Frame("展展聊天工具");
- f.setBounds(300,100,300,350);
- f.setLayout(new FlowLayout());
- setIP=new TextField(10);
- f.add(setIP);
- recewindow=new TextArea(6,35);
- f.add(recewindow);
- sendwindow=new TextArea(6,35);
- f.add(sendwindow);
- but=new Button("信息发送");
- f.add(but);
- MyEvent();
- f.setVisible(true);
- }
- public void MyEvent()
- {
- f.addWindowListener(new WindowAdapter()
- {
- public void windowClosing(WindowEvent e)
- {
- System.exit(0);
- }
- });
- but.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- lock.lock();
- try
- {
- info=sendwindow.getText();
- if(setIP.getText()!="")
- ip=setIP.getText();
- recewindow.append("我发送的:"+info+"\r\n");
- sendwindow.setText("");
- flag=false;
- con1.signal();
-
- }
- catch (Exception ex)
- {
- }
- finally
- {
- lock.unlock();
- }
- }
-
-
- });
-
- }
- public static void main(String[] args)throws Exception
- {
- new ZZOnline();
- DatagramSocket sendds=new DatagramSocket();
- DatagramSocket receds=new DatagramSocket(10003);
- MySend sendSocket=new MySend(sendds);
- MyRece receSocket=new MyRece(receds);
- new Thread(sendSocket).start();
- new Thread(receSocket).start();
- }
- }
- class MySend implements Runnable//发送端
- {
- private DatagramSocket ds;
- MySend(DatagramSocket ds)
- {
- this.ds=ds;
- }
- public void run()
- {
- ZZOnline.lock.lock();
- try
- {
- while(true)
- {
- while (ZZOnline.flag)
- {
- ZZOnline.con1.await();
- }
-
- byte[] buf=ZZOnline.info.getBytes();
- DatagramPacket dp=
- new DatagramPacket(buf,buf.length,InetAddress.getByName(ZZOnline.ip),10003);
- ds.send(dp);
- ZZOnline.flag=true;
- }
- }
- catch (Exception ex)
- {
- }
- finally
- {
- ZZOnline.lock.unlock();
- }
-
- }
- }
- class MyRece implements Runnable//接受端
- {
- private DatagramSocket ds;
- MyRece(DatagramSocket ds)
- {
- this.ds=ds;
- }
- public void run()
- {
- try
- {
- while (true)
- {
- byte[] buf=new byte[1024];
- DatagramPacket dp=new DatagramPacket(buf,buf.length);
- ds.receive(dp);
- String ip=dp.getAddress().getHostAddress();
- String data=new String(dp.getData(),0,dp.getLength());
- ZZOnline.recewindow.append(ip+"::"+data+"\r\n");
- }
- }
- catch (Exception ex)
- {
- }
- }
- }
复制代码
这是我做好的图形化界面小程序,自己做好了跟大家分享分享,希望能帮助到其他的朋友参考学习。
|
|