/** * 基于UDP协议的聊天程序 * * 2007.9.18 * */ //导入包 import java.awt.*; import java.awt.event.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; import java.net.*; public class Chat extends JFrame implements ActionListener { //广播地址或者对方的地址 public static final String sendIP = '127.0.0.1'; //发送端口9527 public static final int sendPort = 8000; JPanel p = new JPanel(); List lst = new List(); //消息显示 JTextField txtIP = new JTextField(18); //填写IP地址 JTextField txtMSG = new JTextField(20); //填写发送消息 JLabel lblIP = new JLabel('IP地址:'); JLabel lblMSG = new JLabel('消息:'); JButton btnSend = new JButton('发送'); byte [] buf; //定义DatagramSocket的对象必须进行异常处理 //发送和接收数据报包的套接字 DatagramSocket ds = null; //=============构造函数===================== public Chat() { CreateInterFace(); //注册消息框监听器 txtMSG.addActionListener(this); btnSend.addActionListener(this); try { //端口:9527 ds =new DatagramSocket(sendPort); } catch(Exception ex) { ex.printStackTrace(); } //============接受消息============ //匿名类 new Thread(new Runnable() { public void run() { byte buf[] = new byte[1024]; //表示接受数据报包 while(true) { try { DatagramPacket dp = new DatagramPacket(buf,1024,InetAddress.getByName(txtIP.getText()),sendPort); ds.receive(dp); lst.add('【消息来自】◆' + dp.getAddress().getHostAddress() + '◆'+'【说】:' + new String (buf,0,dp.getLength()) /*+ dp.getPort()*/,0); } catch(Exception e) { if(ds.isClosed()) { e.printStackTrace(); } } } } }).start(); //关闭窗体事件 this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent w) { System.out.println('test'); int n=JOptionPane.showConfirmDialog(null,'是否要退出?','退出',JOptionPane.YES_NO_OPTION); if(n==JOptionPane.YES_OPTION) { dispose(); System.exit(0); ds.close();//关闭ds对象//关闭数据报套接字 } } }); } //界面设计布局 public void CreateInterFace() { this.add(lst,BorderLayout.CENTER); this.add(p,BorderLayout.SOUTH); p.add(lblIP); p.add(txtIP); p.add(lblMSG); p.add(txtMSG); p.add(btnSend); txtIP.setText(sendIP); //背景颜色 lst.setBackground(Color.yellow); //JAVA默认风格 this.setUndecorated(true); this.getRootPane().setWindowDecorationStyle(JRootPane.FRAME); this.setSize(600,500); this.setTitle('〓聊天室〓'); this.setResizable(false);//不能改变窗体大小 this.setLocationRelativeTo(null);//窗体居中 this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); this.setVisible(true); txtMSG.requestFocus();//消息框得到焦点 } //===============================Main函数=============================== public static void main(String[]args) { new Chat(); } //================================发送消息=============================== //消息框回车发送消息事件 public void actionPerformed(ActionEvent e) { //得到文本内容 buf = txtMSG.getText().getBytes(); //判断消息框是否为空 if (txtMSG.getText().length()==0) { JOptionPane.showMessageDialog(null,'发送消息不能为空','提示',JOptionPane.WARNING_MESSAGE); } else{ try { InetAddress address = InetAddress.getByName(sendIP); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort); ds.send(dp); } catch(Exception ex) { ex.printStackTrace(); } } txtMSG.setText('');//清空消息框 //点发送按钮发送消息事件 if(e.getSource()==btnSend) { buf = txtMSG.getText().getBytes(); try { DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(txtIP.getText()),sendPort); } catch(Exception ex) { ex.printStackTrace(); } txtMSG.setText('');//清空消息框 txtMSG.requestFocus(); } } } 热心网友 2009-11-30
|
|