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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qihuan 中级黑马   /  2015-7-25 19:05  /  387 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

分享一个用GUI实现的一个聊天小程序,大家帮我看看还有什么问题以及如何改进。
  1. package netPractice;

  2. import java.awt.Button;
  3. import java.awt.FlowLayout;
  4. import java.awt.Frame;
  5. import java.awt.TextArea;
  6. import java.awt.TextField;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.KeyAdapter;
  10. import java.awt.event.KeyEvent;
  11. import java.awt.event.WindowAdapter;
  12. import java.awt.event.WindowEvent;
  13. import java.io.IOException;
  14. import java.net.DatagramPacket;
  15. import java.net.DatagramSocket;
  16. import java.net.InetAddress;
  17. import java.net.SocketException;


  18. /**
  19. * UDP实现的一个聊天软件
  20. * 有收数据的部分,和发数据的部分。
  21. * 这两部分需要同时执行。
  22. * 那就需要用到多线程技术。
  23. * 一个线程控制收,一个线程控制发。
  24. * @author Qihuan
  25. *
  26. */

  27. class Gui {
  28.         Frame f;
  29.         TextArea taShow;
  30.         TextField tfSend;
  31.         Button bSend;
  32.        
  33.         void init() {
  34.                 f = new Frame("NewChat");
  35.                 f.setBounds(300,100,300,500);
  36.                 f.setLayout(new FlowLayout());
  37.                
  38.                 taShow = new TextArea(27,36);
  39.                 tfSend = new TextField(29);
  40.                 bSend = new Button("Send");
  41.                
  42.                 f.add(taShow);
  43.                 f.add(tfSend);
  44.                 f.add(bSend);
  45.                
  46.                 f.addWindowListener(new WindowAdapter(){
  47.                         public void windowClosing(WindowEvent e){
  48.                                 System.exit(0);
  49.                         }
  50.                 });
  51.                
  52.                 f.setVisible(true);
  53.         }
  54.        
  55.         private Gui(){}
  56.         public static Gui r = new Gui();
  57.         public static Gui getInstance(){
  58.                 return r;
  59.         }
  60. }

  61. //发送端
  62. class SendMs implements Runnable {
  63.        
  64.        
  65.        
  66.         private DatagramSocket ds;
  67.         public SendMs(DatagramSocket ds) {
  68.                 this.ds = ds;
  69.         }

  70.         public void run() {
  71.                 try {                       
  72.                         Gui.getInstance().init();
  73.                        
  74.                         Gui.getInstance().bSend.addActionListener(new ActionListener() {
  75.                                 public void actionPerformed(ActionEvent e) {
  76.                                         SendMessage();
  77.                                 }
  78.                         });
  79.                        
  80.                         Gui.getInstance().tfSend.addKeyListener(new KeyAdapter() {
  81.                                 public void keyPressed(KeyEvent e) {
  82.                                         if(e.getKeyCode()==KeyEvent.VK_ENTER){
  83.                                                 SendMessage();
  84.                                         }
  85.                                 }
  86.                         });
  87.                 } catch (Exception e) {
  88.                         throw new RuntimeException("发送失败");
  89.                 }
  90.         }

  91.         protected void SendMessage() {
  92.                 String line = Gui.getInstance().tfSend.getText();
  93.                 byte[] buf = line.getBytes();
  94.                 try {
  95.                         DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("192.168.0.255"),10005);
  96.                         ds.send(dp);
  97.                 } catch (IOException e1) {
  98.                         e1.printStackTrace();
  99.                 }
  100.                 Gui.getInstance().tfSend.setText(null);
  101.         }
  102. }

  103. //接收端
  104. class ReceiveMs implements Runnable {
  105.        
  106.         private DatagramSocket ds;
  107.         public ReceiveMs(DatagramSocket ds) {
  108.                 this.ds = ds;
  109.         }
  110.         public void run() {
  111.                 try {
  112. //                        Gui.getInstance().init();
  113.                         while (true) {
  114.                                
  115.                                 byte[] buf = new byte[1024];
  116.                                 DatagramPacket dp = new DatagramPacket(buf, buf.length);
  117.                                
  118.                                 ds.receive(dp);
  119.                                
  120.                                 String name = dp.getAddress().getHostName();
  121.                                 String ip = dp.getAddress().getHostAddress();
  122.                                 String data = new String(dp.getData(), 0, dp.getLength());
  123.                                
  124.                                 Gui.getInstance().taShow.append(name+"("+ip+"):"+data+"\r\n");
  125.                                
  126.                                 System.out.println(name+"("+ip+"):"+data);
  127.                         }
  128.                 } catch (Exception e) {
  129.                         throw new RuntimeException("接收失败");
  130.                 }
  131.         }
  132. }


  133. public class NewChat {
  134.         public static void main(String[] args) {
  135.                
  136.                 try {
  137.                         DatagramSocket sendSocket = new DatagramSocket();
  138.                         DatagramSocket receiveSocket = new DatagramSocket(10005);
  139.                        
  140.                         SendMs sm = new SendMs(sendSocket);
  141.                         ReceiveMs rm = new ReceiveMs(receiveSocket);
  142.                        
  143.                         new Thread(sm).start();
  144.                         new Thread(rm).start();
  145.                 } catch (SocketException e) {
  146.                         e.printStackTrace();
  147.                 }
  148.         }
  149. }
复制代码



0 个回复

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