现在的位置: 首页 > 综合 > 正文

UDP 实验

2014年01月28日 ⁄ 综合 ⁄ 共 8284字 ⁄ 字号 评论关闭

1、ChatFrame.java

Code:
  1. package forfun.udp;   
  2.   
  3. import java.awt.*;   
  4. import java.awt.event.*;   
  5. import java.io.*;   
  6. import java.net.*;   
  7. import java.util.*;   
  8. import javax.swing.*;   
  9.   
  10.   
  11. public class ChatFrame extends JFrame {   
  12.     private String title = null;        //显示框的标题   
  13.        
  14.     private int inPort;                 //接收端口   
  15.     private int outPort;                //发送端口   
  16.        
  17.     private JTextArea ta;               //显示文本框   
  18.     private JTextArea inTa;             //输入文本框   
  19.     private JButton sendButton;         //发送按钮   
  20.     private JButton exitButton;         //退出按钮     
  21.     private JLabel addrLabel;           //显示要连接的IP地址   
  22.     private JTextField addrTf;          //输入要连接的IP地址   
  23.     private JButton connectButton;      //连接到指定的IP地址   
  24.     private JButton resetButton;        //设置重新要连接的IP地址   
  25.   
  26.     private int x = 230;   
  27.     private int y = 200;   
  28.     private int width = 550;   
  29.     private int height = 650;   
  30.        
  31.     private String address = "localhost";       //设置默认IP地址   
  32.   
  33.        
  34.     public ChatFrame(String title) {    //构造函数,为Frame加上一title   
  35.         this.title = title;    
  36.         launch();   
  37.     }   
  38.        
  39.     public void setPort(int inPort, int outPort) {          //设置输入、输出端口   
  40.         this.inPort = inPort;   
  41.         this.outPort =outPort;   
  42.     }   
  43.        
  44.     public void launch() {              //设置界面   
  45.            
  46.         int rows = 5;   
  47.         int columns = 30;   
  48.         int hgap = 8;   
  49.         int vgap = 8;   
  50.            
  51.         setBounds(x, y, width, height);   
  52.         ta = new JTextArea();                  
  53.         inTa = new JTextArea(rows, columns);               
  54.         ta.setEditable(false);   
  55.         sendButton = new JButton("Send");      
  56.         sendButton.setEnabled(false);   
  57.         sendButton.setToolTipText("ctrl+enter can also send the information!!");                //显示sendButton的提示信息   
  58.         sendButton.addActionListener(new ActionListener() {   
  59.             public void actionPerformed(ActionEvent e) {   
  60.                 send();   
  61.                 inTa.setText("");   
  62.             }   
  63.         });   
  64.         inTa.addKeyListener(new KeyAdapter() {   
  65.             public void keyPressed(KeyEvent e) {                       
  66.                 if((e.getKeyCode() == KeyEvent.VK_ENTER) && ((e.getModifiers() & KeyEvent.CTRL_MASK) == KeyEvent.CTRL_MASK) && sendButton.isEnabled()) {        //判断按键是否为ctrl+enter   
  67.                     send();   
  68.                     inTa.setText("");   
  69.                 }   
  70.             }   
  71.         });   
  72.         exitButton = new JButton("exit");                  
  73.         exitButton.addActionListener(new ActionListener() {   
  74.             public void actionPerformed(ActionEvent e) {   
  75.                 System.exit(0);   
  76.             }   
  77.         });   
  78.         addrLabel = new JLabel("Address:");   
  79.         addrTf = new JTextField();   
  80.         connectButton = new JButton("Connectoin");   
  81.         connectButton.addActionListener(new ActionListener() {   
  82.             public void actionPerformed(ActionEvent e) {   
  83.                 resetButton.setEnabled(true);   
  84.                 connectButton.setEnabled(false);   
  85.                 sendButton.setEnabled(true);   
  86.                 address = addrTf.getText().trim();   
  87.                 addrTf.setEditable(false);   
  88.             }   
  89.         });   
  90.         resetButton = new JButton("Rest");   
  91.         resetButton.setEnabled(false);   
  92.         resetButton.addActionListener(new ActionListener() {   
  93.             public void actionPerformed(ActionEvent e) {   
  94.                 resetButton.setEnabled(false);   
  95.                 connectButton.setEnabled(true);   
  96.                 sendButton.setEnabled(false);   
  97.                 addrTf.setEditable(true);   
  98.                 ta.setText("");   
  99.             }   
  100.         });   
  101.            
  102.         JPanel addrPanel = new JPanel();                    //装有地址输入控件的jPanel   
  103.         JPanel crPanel = new JPanel();                      //装有connection和reset 按钮的JPanel   
  104.         crPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 22));   
  105.         crPanel.add(connectButton);   
  106.         crPanel.add(resetButton);   
  107.         addrPanel.setLayout(new BorderLayout(55));   
  108.         addrPanel.add(addrLabel, BorderLayout.WEST);   
  109.         addrPanel.add(addrTf, BorderLayout.CENTER);   
  110.         addrPanel.add(crPanel, BorderLayout.EAST);   
  111.            
  112.         JPanel panel = new JPanel();                    //底部Jpanel,装有buttonJpanel、inScroll   
  113.         panel.setLayout(new BorderLayout());   
  114.         JPanel buttonPanel = new JPanel();              //装有按钮的JPanel,装在panel中   
  115.         buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, hgap, vgap));   
  116.         buttonPanel.add(sendButton);   
  117.         buttonPanel.add(exitButton);   
  118.            
  119.         JScrollPane inScroll = new JScrollPane(inTa);          
  120.         panel.add(inScroll);           
  121.         panel.add(buttonPanel, BorderLayout.SOUTH);   
  122.            
  123.         this.setLayout(new BorderLayout());   
  124.         JScrollPane scroll = new JScrollPane(ta);   
  125.         this.add(addrPanel, BorderLayout.NORTH);   
  126.         this.add(scroll);   
  127.         this.add(panel, BorderLayout.SOUTH);   
  128.         new Thread(new ReceiveThread()).start();   
  129.     }   
  130.        
  131.     public void send() {                                //发送信息   
  132.         String str = inTa.getText().trim();   
  133.         byte[] bytes = str.getBytes();   
  134.            
  135.         InetAddress addr = null;   
  136.         try {   
  137.             addr = InetAddress.getByName(address);   
  138.             DatagramPacket packet = new DatagramPacket(bytes, bytes.length, addr, outPort); //数据发送包,设置发送包的目标地址和发送的端口号   
  139.             DatagramSocket dgSocket = new DatagramSocket();   
  140.                
  141.             dgSocket.send(packet);   
  142.             ta.append("/ntime:" + getTime() + "   I say:/n" + "" + str);   
  143.             bytes = null;   
  144.         } catch (UnknownHostException e) {   
  145.             e.printStackTrace();   
  146.         } catch (SocketException e) {   
  147.             e.printStackTrace();   
  148.         } catch (IOException e) {   
  149.             e.printStackTrace();   
  150.         }      
  151.     }   
  152.        
  153.     public String getTime() {                       //获取当前时间   
  154.         String time = null;    
  155.         Calendar calendar = Calendar.getInstance();   
  156.         int hour = calendar.get(Calendar.HOUR);   
  157.         int minute = calendar.get(Calendar.MINUTE);   
  158.         int second = calendar.get(Calendar.SECOND);   
  159.         int amOrpm = calendar.get(Calendar.AM_PM);     
  160.         time = new String(hour + ":" + minute + ":" + second + " " + amOrpm);      
  161.         return time;   
  162.     }   
  163.        
  164.        
  165.     class ReceiveThread implements Runnable {       //接收信息   
  166.            
  167.         public void run() {   
  168.             DatagramPacket packet = null;   
  169.             DatagramSocket dgSocket = null;            
  170.                        
  171.             try {   
  172.                 dgSocket = new DatagramSocket(inPort);          //数据接收包,设置接收包的端口号   
  173.                 while(true) {   
  174.                     byte[] bytes = new byte[30];   
  175.                     packet = new DatagramPacket(bytes, bytes.length);   
  176.                     dgSocket.receive(packet);   
  177.                     String str = new String(bytes);   
  178.                     ta.append("/ntime:  " + getTime() + "   ");   
  179.                     ta.append("other says:/n" + "" + str);   
  180.                     ta.setCaretPosition(ta.getText().length());   
  181.                     Thread.sleep(100);   
  182.                 }   
  183.             } catch (SocketException e) {   
  184.                 e.printStackTrace();   
  185.             } catch (IOException e) {   
  186.                 e.printStackTrace();   
  187.             } catch (InterruptedException e) {   
  188.                 e.printStackTrace();   
  189.             }          
  190.         }      
  191.     }   
  192.        
  193. }      

2.ChatA.java

Code:
  1. package forfun.udp;   
  2.   
  3. import javax.swing.*;   
  4.   
  5. public class ChatA {   
  6.   
  7.     public static void main(String[] args) {   
  8.         String title = "chatFrame";    
  9.         int inPort = 8880;   
  10.         int outPort = 8888;   
  11.            
  12.         ChatFrame cf = new ChatFrame(title);   
  13.         cf.setPort(inPort, outPort);   
  14.         cf.setVisible(true);   
  15.         cf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  16.     }   
  17. }   

3.ChatB.java

Code:
  1. package forfun.udp;   
  2.   
  3. import javax.swing.*;   
  4.   
  5. public class ChatB {   
  6.   
  7.     public static void main(String[] args) {   
  8.         String title = "chatFrame";    
  9.         int inPort = 8888;   
  10.         int outPort = 8880;   
  11.            
  12.         ChatFrame cf = new ChatFrame(title);   
  13.         cf.setPort(inPort, outPort);   
  14.         cf.setVisible(true);   
  15.         cf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  16.     }   
  17. }   

抱歉!评论已关闭.