黑马程序员技术交流社区

标题: 我想在UDP聊天中添加一个GUI界面,但不知道如何下手 [打印本页]

作者: Ysfox    时间: 2013-7-16 15:08
标题: 我想在UDP聊天中添加一个GUI界面,但不知道如何下手
  1. import java.io.*;
  2. import java.net.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. class UdpSend implements Runnable
  6. {
  7.         private DatagramSocket ds;
  8.         UdpSend(DatagramSocket ds)
  9.         {
  10.                 this.ds = ds;
  11.         }
  12.         public void run()
  13.         {       
  14.                 try
  15.                 {
  16.                                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  17.                                 String line = null;
  18.                                 while((line=br.readLine())!=null)
  19.                                 {
  20.                                         byte[] buf = line.getBytes();
  21.                                         DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10086);
  22.                                         ds.send(dp);
  23.                                 }
  24.                        
  25.                 }
  26.                 catch (Exception e)
  27.                 {
  28.                         System.out.println("传送数据失败!");
  29.                 }
  30.         }
  31. }
  32. class UdpReceive implements Runnable
  33. {
  34.         private DatagramSocket ds;
  35.         UdpReceive(DatagramSocket ds)
  36.         {
  37.                 this.ds = ds;
  38.         }
  39.         public void run()
  40.         {
  41.                 try
  42.                 {
  43.                         while(true)
  44.                         {
  45.                                 byte[] buf = new byte[1024];
  46.                                 DatagramPacket dp = new DatagramPacket(buf,buf.length);       
  47.                                 ds.receive(dp);
  48.                                
  49.                                 InetAddress ia = dp.getAddress();
  50.                                 String name = ia.getHostName();
  51.                                 String ip = ia.getHostAddress();
  52.                                 String data = new String(dp.getData(),0,dp.getLength());
  53.                                 System.out.println(name+":"+ip+"--"+data);
  54.                         }
  55.                 }
  56.                 catch (Exception e)
  57.                 {
  58.                         System.out.println("接收数据异常!");
  59.                 }
  60.         }
  61. }
  62. class YY
  63. {
  64.         public static void main(String[] args) throws Exception                        //建立传输/接收对象要抛异常
  65.         {
  66.                 new Thread(new UdpSend(new DatagramSocket())).start();
  67.                 new Thread(new UdpReceive(new DatagramSocket(10086))).start();       
  68.         }
  69. }
复制代码
以上是UDP的聊天代码,我想为这个代码添加一个GUI的界面,但不知道如何下手,请高手指点下呗!
作者: 牛海亮    时间: 2013-7-17 13:58
本帖最后由 牛海亮 于 2013-7-17 14:12 编辑

我也一直想做一个,做了一上午,终于做出来了,代码如下:
  1. package udpChat;

  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.io.File;
  5. import java.net.DatagramPacket;
  6. import java.net.DatagramSocket;
  7. import java.net.InetAddress;

  8. public class UdpChatFrame {
  9.         private Frame f;
  10.         private TextField tf;
  11.         private Button but;
  12.         private Button butSend;
  13.         private TextArea taReceive;// 数据接收窗口
  14.         private TextArea taSend;// 数据发送窗口

  15.         private Dialog d;// 用于校验IP地址
  16.         private Label receiveLab;
  17.         private Label sendLab;
  18.         private Button okBut;// 对话框上的确定按钮
  19.         
  20.         public String ip;
  21.         UdpChatFrame() {
  22.                

  23.         }
  24.         //创建窗体,开启线程
  25.         public void init() {

  26.                 f = new Frame("Udp聊天框");
  27.                 f.setBounds(300, 100, 600, 500);
  28.                 f.setLayout(new FlowLayout());

  29.                 tf = new TextField(70);
  30.                 but = new Button("连接");
  31.                 taReceive = new TextArea(10, 60);
  32.                 taSend = new TextArea(10, 60);
  33.                 receiveLab = new Label("接收信息:");
  34.                 sendLab = new Label("发送信息:");
  35.                 butSend = new Button("发送");

  36.                 f.add(tf);
  37.                 f.add(but);
  38.                 f.add(receiveLab);
  39.                 f.add(taReceive);
  40.                 f.add(sendLab);
  41.                 f.add(taSend);
  42.                 f.add(butSend);
  43.                
  44.                 //开启一个接收线程用于不断地接收输入的信息
  45.                 new Thread(new ReceiveThread()).start();
  46.                 myEvent();
  47.                
  48.                 f.setVisible(true);
  49.         }

  50.         private void myEvent() {
  51.                 //监听 连接 按钮
  52.                 but.addActionListener(new ActionListener() {
  53.                         public void actionPerformed(ActionEvent e) {
  54.                                 ip = tf.getText();
  55.                                 taReceive.append("开始和" + ip + "主机对话吧......" + "\r\n");
  56.                                 taReceive.append("---------------------------------------"
  57.                                                 + "\r\n");
  58.                                 
  59.                         
  60.                         }
  61.                 });
  62.                 //监听 发送 按钮
  63.                 butSend.addActionListener(new ActionListener() {
  64.                         public void actionPerformed(ActionEvent e) {
  65.                                 String message = taSend.getText();
  66.                                 taReceive.append("我:" + message + "\r\n");
  67.                                 send(message);
  68.                                 taSend.setText("");
  69.                         }
  70.                 });
  71.                 f.addWindowListener(new WindowAdapter() {

  72.                         public void windowClosing(WindowEvent e) {
  73.                                 System.exit(0);

  74.                         }
  75.                 });

  76.         }
  77.         //发送 方法
  78.         public void send(String message)
  79.         {
  80.                 try
  81.                 {
  82.                         DatagramSocket ds = new DatagramSocket();                        
  83.                                 byte[] buf = message.getBytes();
  84.                                 //将缓冲区中的数据打包,用于发送。
  85.                                 DatagramPacket dp =
  86.                                                 new DatagramPacket(buf, buf.length,InetAddress.getByName(ip), 10086);
  87.                                 ds.send(dp);
  88.                         
  89.                         
  90.                 }
  91.                 catch (Exception e)
  92.                 {
  93.                         e.printStackTrace();
  94.                 }
  95.                
  96.         }
  97.         
  98.         //内部类  用于接收
  99.         public class ReceiveThread implements Runnable {
  100.                 private DatagramSocket receiveDs;
  101.                 public void setReceiveDs()
  102.                 {
  103.                         try
  104.                         {
  105.                                 this.receiveDs = new DatagramSocket(10086);
  106.                         }
  107.                         catch (Exception e)
  108.                         {
  109.                                 e.printStackTrace();
  110.                         }                        
  111.                 }
  112.                 //一创建就 标好端口号
  113.                 ReceiveThread()
  114.                 {

  115.                         setReceiveDs();
  116.                 }

  117.                
  118.                 public void run() {
  119.                         try
  120.                         {
  121.                                 while(true)
  122.                                 {
  123.                                         byte[] buf = new byte[1024];
  124.                                         //将接收缓冲区封装起来,用于存放接收到的数据。
  125.                                         DatagramPacket dp = new DatagramPacket(buf, buf.length);
  126.                                         receiveDs.receive(dp);                                
  127.                                         String data = new String(dp.getData(),0,dp.getLength());
  128.                                        
  129.                                                 taReceive.append("他:"+data+"\r\n");        
  130.                                        
  131.                                 }                        
  132.                                 
  133.                         }
  134.                         catch (Exception e)
  135.                         {                        
  136.                                 e.printStackTrace();                        
  137.                         }
  138.                 }
  139.                
  140.         }
  141.                
  142.         }
复制代码

作者: 牛海亮    时间: 2013-7-17 13:59
主函数:
  1. package udpChat;
  2. import java.net.*;

  3. public class UdpChat {
  4.        

  5.         public static void main(String[] args)
  6.         {
  7.                
  8.                 try
  9.                 {
  10.                         UdpChatFrame udpChatFrame = new UdpChatFrame();
  11.                         udpChatFrame.init();       
  12.                        
  13.                 }
  14.                 catch (Exception e)
  15.                 {
  16.                         e.printStackTrace();
  17.                 }       

  18.         }

  19. }
复制代码

作者: 牛海亮    时间: 2013-7-17 14:09
本帖最后由 牛海亮 于 2013-7-17 21:55 编辑

缺陷:接收端也能输入。
遇到的最大的困难就是需要在init()方法中开启两个线程,主线程和接收线程,也就是说需要在一个类的方法中运行两个线程。
解决方法:接收线程定义了内部类ReceiveThread。
希望能对你有帮助。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2