A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 展展 中级黑马   /  2014-4-13 12:31  /  890 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 展展 于 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发送端在活一下,走一次代码。
        具体还是看代码吧。


  1. /*
  2.         展展聊天工具
  3. */

  4. import java.awt.*;
  5. import java.awt.event.*;
  6. import java.net.*;
  7. import java.io.*;
  8. import java.util.concurrent.locks.*;

  9. class ZZOnline
  10. {
  11.         private Frame f;
  12.         private TextField setIP;


  13.         public static TextArea recewindow;
  14.         private TextArea sendwindow;
  15.         private Button but;

  16.         public static String info;
  17.         public static String ip="127.0.0.1";

  18.         public static Lock lock=new ReentrantLock();
  19.         public static Condition con1=lock.newCondition();
  20.         public static Condition con2=lock.newCondition();

  21.         public static boolean flag=true;

  22.         ZZOnline()
  23.         {
  24.                 init();
  25.         }

  26.         public void init()
  27.         {
  28.                 f=new Frame("展展聊天工具");
  29.                 f.setBounds(300,100,300,350);
  30.                 f.setLayout(new FlowLayout());

  31.                 setIP=new TextField(10);
  32.                 f.add(setIP);


  33.                 recewindow=new TextArea(6,35);
  34.                 f.add(recewindow);

  35.                 sendwindow=new TextArea(6,35);
  36.                 f.add(sendwindow);

  37.                 but=new Button("信息发送");
  38.                 f.add(but);

  39.                 MyEvent();

  40.                 f.setVisible(true);

  41.         }

  42.         public void MyEvent()
  43.         {
  44.                 f.addWindowListener(new WindowAdapter()
  45.                 {
  46.                         public void windowClosing(WindowEvent e)
  47.                         {
  48.                                 System.exit(0);
  49.                         }
  50.                 });

  51.                 but.addActionListener(new ActionListener()
  52.                 {
  53.                         public void actionPerformed(ActionEvent e)
  54.                         {
  55.                                 lock.lock();
  56.                                 try
  57.                                 {
  58.                                         info=sendwindow.getText();

  59.                                         if(setIP.getText()!="")
  60.                                                 ip=setIP.getText();
  61.                                         recewindow.append("我发送的:"+info+"\r\n");
  62.                                         sendwindow.setText("");

  63.                                         flag=false;
  64.                                         con1.signal();
  65.                                        
  66.                                 }
  67.                                 catch (Exception ex)
  68.                                 {
  69.                                 }

  70.                                 finally
  71.                                 {
  72.                                         lock.unlock();
  73.                                 }

  74.                         }
  75.                
  76.                
  77.                 });
  78.         
  79.         }
  80.         public static void main(String[] args)throws Exception
  81.         {
  82.                         new ZZOnline();
  83.                         DatagramSocket sendds=new DatagramSocket();
  84.                         DatagramSocket receds=new DatagramSocket(10003);
  85.                         MySend sendSocket=new MySend(sendds);
  86.                         MyRece receSocket=new MyRece(receds);

  87.                         new Thread(sendSocket).start();
  88.                         new Thread(receSocket).start();

  89.         }
  90. }

  91. class MySend implements Runnable//发送端
  92. {
  93.         private DatagramSocket ds;
  94.         MySend(DatagramSocket ds)
  95.         {
  96.                 this.ds=ds;
  97.         }

  98.         public void run()
  99.         {
  100.                 ZZOnline.lock.lock();
  101.                 try
  102.                 {
  103.                         while(true)
  104.                         {
  105.                                 while (ZZOnline.flag)
  106.                                 {
  107.                                         ZZOnline.con1.await();
  108.                                 }
  109.                         
  110.                                 byte[] buf=ZZOnline.info.getBytes();
  111.                                 DatagramPacket dp=
  112.                                         new DatagramPacket(buf,buf.length,InetAddress.getByName(ZZOnline.ip),10003);
  113.                                 ds.send(dp);
  114.                                 ZZOnline.flag=true;
  115.                         }

  116.                 }
  117.                 catch (Exception ex)
  118.                 {

  119.                 }

  120.                 finally
  121.                 {
  122.                         ZZOnline.lock.unlock();               
  123.                 }
  124.         
  125.         }

  126. }


  127. class MyRece implements Runnable//接受端
  128. {
  129.         private DatagramSocket ds;
  130.         MyRece(DatagramSocket ds)
  131.         {
  132.                 this.ds=ds;
  133.         }

  134.         public void run()
  135.         {
  136.                 try
  137.                 {
  138.                         while (true)
  139.                         {
  140.                                 byte[] buf=new byte[1024];
  141.                                 DatagramPacket dp=new DatagramPacket(buf,buf.length);

  142.                                 ds.receive(dp);

  143.                                 String ip=dp.getAddress().getHostAddress();
  144.                                 String data=new String(dp.getData(),0,dp.getLength());

  145.                                 ZZOnline.recewindow.append(ip+"::"+data+"\r\n");
  146.                         }

  147.                 }
  148.                 catch (Exception ex)
  149.                 {

  150.                 }

  151.         }

  152. }
复制代码

这是我做好的图形化界面小程序,自己做好了跟大家分享分享,希望能帮助到其他的朋友参考学习。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马